2016-03-12 76 views
0

如何用SpEL解析泛型表達式?用Spring Expression Language(SpEL)解析泛型

StandardEvaluationContext context = new StandardEvaluationContext(); 
ExpressionParser parser = new SpelExpressionParser(); 
String queryString = "new List<Integer>()"; 
Expression exp = parser.parseExpression(queryString); 
List<Integer> list = (List<Integer>) exp.getValue(context); 

這是拋出異常。 SpEL允許解析任意表達式。 我在這裏錯過了什麼?

org.springframework.expression.spel.SpelParseException: EL1050E:(pos 8): The arguments (...) for the constructor call are missing 
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatConstructorArgs(InternalSpelExpressionParser.java:450) 
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.maybeEatConstructorReference(InternalSpelExpressionParser.java:792) 
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatStartNode(InternalSpelExpressionParser.java:507) 
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatPrimaryExpression(InternalSpelExpressionParser.java:343) 
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatUnaryExpression(InternalSpelExpressionParser.java:337) 
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatPowerIncDecExpression(InternalSpelExpressionParser.java:293) 
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatProductExpression(InternalSpelExpressionParser.java:272) 
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatSumExpression(InternalSpelExpressionParser.java:255) 
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatRelationalExpression(InternalSpelExpressionParser.java:210) 
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatLogicalAndExpression(InternalSpelExpressionParser.java:198) 
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatLogicalOrExpression(InternalSpelExpressionParser.java:186) 
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatExpression(InternalSpelExpressionParser.java:146) 
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.doParseExpression(InternalSpelExpressionParser.java:127) 
    at org.springframework.expression.spel.standard.SpelExpressionParser.doParseExpression(SpelExpressionParser.java:60) 
    at org.springframework.expression.spel.standard.SpelExpressionParser.doParseExpression(SpelExpressionParser.java:32) 
    at org.springframework.expression.common.TemplateAwareExpressionParser.parseExpression(TemplateAwareExpressionParser.java:76) 
    at org.springframework.expression.common.TemplateAwareExpressionParser.parseExpression(TemplateAwareExpressionParser.java:62) 

回答

1

您可以使用Inline list規劃環境地政司的能力:

StandardEvaluationContext context = new StandardEvaluationContext(); 
ExpressionParser parser = new SpelExpressionParser(); 
String queryString = "{1,2,3}"; 
Expression exp = parser.parseExpression(queryString); 
List<Integer> list = (List<Integer>) exp.getValue(context); 
int one = list.get(0); 

或者,也可以在SpEL context定義名單。

+0

我的用例有點不同。 DynamoDBQueryExpression queryExpression = new DynamoDBQueryExpression ().withHashKeyValues(carter); \t \t DynamoDBQueryExpression REQ =(DynamoDBQueryExpression )exp.getValue(上下文) –

+0

@PremKumar然後使用:'字符串的queryString = 「{}」;' –

+0

@PremKumar看到我對規劃環境地政司方面的答案更新。 –

0

SpEL太好了,無法忽略。所以我最終解決了這個問題,如下所示:

由於Java類型的橡皮擦,下面的函數返回無關緊要 - DynamoDBQueryExpression <用戶>或DynamoDBQueryExpression < Object>。在運行時兩者都是相同的。

public class DynamoDBQueryExpressionGenerics { 
    public static DynamoDBQueryExpression<?> get(){ 
     return new DynamoDBQueryExpression<Object>(); 
    } 
} 


    StandardEvaluationContext context = new StandardEvaluationContext(); 
    context.setVariable("attr", prem); 
    String queryString = "T(DynamoDBQueryExpressionGenerics).get().withHashKeyValues(#attr)"; 
    ExpressionParser parser = new SpelExpressionParser(); 

    Expression exp = parser.parseExpression(queryString); 
    DynamoDBQueryExpression<User> req = (DynamoDBQueryExpression<User>) exp.getValue(context); 
    System.out.println(req); 
    PaginatedList<User> r = mapper.query(User.class, req); 
    for(User u : r){ 
     System.out.println("Query Expression : " + u.getFirstName() + " : " + u.getLastName()); 
    }