【问题标题】:Update property in collection with spring expression language (SpEL)使用 Spring 表达式语言 (SpEL) 更新集合中的属性
【发布时间】:2012-03-30 19:19:12
【问题描述】:

是否可以使用 Spring 表达式语言提取集合并同时修改集合中每个对象的属性?在我的示例中,我有一个名称太长的用户列表,我想在名称显示在页面之前限制名称的长度(因此不要更新原始列表)。此代码用于通过 ajax 请求的控制器中,用户列表作为 json 数组返回。

ExpressionParser parser = new SpelExpressionParser();
EvaluationContext context = new StandardEvaluationContext(rankedUsers);
List<User> longNamedUsers = (List<User>) parser.parseExpression("?[name.length() > 20]").getValue(context);

EvaluationContext newContext = new StandardEvaluationContext(longNamedUsers);
// the below does not work but throws an exception
//parser.parseExpression("?[name]").setValue(newContext, "test");

【问题讨论】:

  • 您能发布更多信息吗?您是否试图截断名称以进行显示?您使用的是 JSP 还是 JSF?此代码是否出现在控制器或服务中?

标签: java spring collections spring-el


【解决方案1】:

你有一些可能性,重要的是你想要实现什么。要获取所有名称,而那些长于特定大小的名称会缩短,您可以这样做:

List<User> lu = new ArrayList<User>();
lu.add(new User("Short user name"));
lu.add(new User("Very long user name which should be shortend"));

ExpressionParser parser = new SpelExpressionParser();
EvaluationContext context = new StandardEvaluationContext(lu);

List<String> names = (List<String>)parser.parseExpression("![name.length() > 20 ? name.substring(0,20) : name]").getValue(context);

for (String name : names) {
    System.out.println("Name: " + name);
}

【讨论】:

    【解决方案2】:

    Spring 的 EL 用于从对象或对象图中提取数据,而不是对这些对象进行变异或设置值。当您调用 setValue() 时,它位于解析器返回的 Expression 上,而不是解析表达式的对象。

    【讨论】:

    • 好的,我再次更新了我的问题,希望能更清楚一点。
    猜你喜欢
    • 2014-01-14
    • 2011-10-04
    • 2016-06-27
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2012-05-24
    相关资源
    最近更新 更多