我正在尝试使用SpEL编写简单的验证规则
我希望能够说出类似的内容,"列表中的任何元素的值都大于x"。简单的情况下工作正常,但我想扩展它以获得绝对值,然后做大于测试
如果我尝试将方法或函数作为条件的一部分来从集合中进行选择。它似乎忽略了我正在使用集合中的项目的上下文
import java.util.Arrays;
import java.util.List;
public class BeanClass {
private final List<ListOf> list;
public BeanClass(ListOf... list){
this.list = Arrays.asList(list);
}
public List<ListOf> getList(){
return list;
}
}
public class ListOf {
private final double value;
public ListOf(double v) {
this.value = v;
}
public double getValue() {
return value;
}
}
import org.junit.Test;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import static org.junit.Assert.assertTrue;
public class SpelTest {
@Test
public void test(){
ExpressionParser parser = new SpelExpressionParser();
// works as expected
Expression expression1 = parser.parseExpression("list.?[ value>2 ].size()!=0");
assertTrue(expression1.getValue(new BeanClass(new ListOf(1.1), new ListOf(2.2)), Boolean.class));
Expression expression2 = parser.parseExpression("list.?[ T(java.lang.Math).abs(value) > 2 ].size()!=0");
// get this error:
//org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 5): Property or field 'value' cannot be found on object of type 'BeanClass' - maybe not public?
assertTrue(expression2.getValue(new BeanClass(new ListOf(1.1), new ListOf(-2.2)), Boolean.class));
}
}
我玩过定义自己的功能并注册
使用#this进行实验
答案 0 :(得分:0)
看起来像是一个问题:https://jira.spring.io/browse/SPR-12035
结论是:您可以在selectionExpression
items
内使用方法调用。
答案 1 :(得分:0)
您需要添加#this
来引用当前项目,例如:
Expression expression2 = parser.parseExpression("list.?[ T(java.lang.Math).abs(#this.getValue()) > 2 ].size()!=0");