【问题标题】:Parsing Generics with Spring Expression Language(SpEL)使用 Spring 表达式语言 (SpEL) 解析泛型
【发布时间】:2016-06-27 17:36:03
【问题描述】:

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

【问题讨论】:

    标签: spring spring-data spring-el


    【解决方案1】:

    你可以使用Inline listSpEL能力:

    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 中定义您的列表。

    【讨论】:

    • 我的用例略有不同。 DynamoDBQueryExpression queryExpression = new DynamoDBQueryExpression().withHashKeyValues(carter); DynamoDBQueryExpression req = (DynamoDBQueryExpression) exp.getValue(context)
    • @PremKumar 然后使用:String queryString = "{}";
    • 好的..这是我最简单的查询字符串。 String queryString = "new DynamoDBQueryExpression().withHashKeyValues(#attr1)";
    • 在不涉及泛型的情况下可以正常工作。例如它工作得很好。 String deleteTableString = "new com.amazonaws.services.dynamodbv2.model.DeleteTableRequest().withTableName(#tableName)";
    • @PremKumar SpEL 不支持泛型参数。
    【解决方案2】:

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

    由于 Java 类型的橡皮擦,以下函数是否返回 - DynamoDBQueryExpression 或 DynamoDBQueryExpression 并不重要。两者在运行时是相同的。

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

    【讨论】:

      【解决方案3】:
      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);
      

      【讨论】:

        猜你喜欢
        • 2012-05-24
        • 2014-01-14
        • 2017-07-20
        • 2011-10-04
        • 2020-06-03
        • 1970-01-01
        • 2013-12-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多