首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Spring Expression Language(SpEL)解析泛型

使用Spring Expression Language(SpEL)解析泛型
EN

Stack Overflow用户
提问于 2016-03-12 20:41:35
回答 3查看 1.3K关注 0票数 1

如何使用SpEL解析泛型表达式?

代码语言:javascript
复制
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允许解析任意表达式。这里我漏掉了什么?

代码语言:javascript
复制
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)   
EN

回答 3

Stack Overflow用户

发布于 2016-03-12 21:14:20

您可以使用Inline list SpEL功能:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-03-13 00:08:31

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

由于Java类型的橡皮擦,下面的函数返回- DynamoDBQueryExpression< User>还是DynamoDBQueryExpression< Object>并不重要。两者在运行时都是相同的。

代码语言:javascript
复制
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());
    }
票数 0
EN

Stack Overflow用户

发布于 2018-04-25 19:23:19

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35957756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档