使用Spring表达式语言(SpEL)解析泛型

时间:2016-03-12 12:41:35

标签: spring spring-data spring-el

如何使用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)   

3 个答案:

答案 0 :(得分:1)

您可以使用Inline list SpEL功能:

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

中定义列表

答案 1 :(得分:0)

SpEL太好了,不容忽视。所以我最终解决了这个问题如下:

由于Java类型的橡皮擦,跟随函数返回是否真的无关紧要 - DynamoDBQueryExpression&lt;使用者名称&gt;或DynamoDBQueryExpression&lt;对象&gt ;.两者在运行时都是相同的。

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());
    }

答案 2 :(得分:0)

List<Integer> myList = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5));

ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext(myList);

context.setVariable("myList", myList);

List<Integer> newList = parser.parseExpression("#myList").getValue(context, List.class);