使用spring表达式语言(SpEL)更新集合中的属性

时间:2012-03-14 10:29:33

标签: java spring collections spring-el

是否可以使用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");

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

你有一些可能性,对你想要达到的目标很重要。要获得所有名称,以及那些长度超过一定大小的名称,您可以这样做:

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