SPEL(Spring表达式语言)集合选择调用选择中的方法/函数

时间:2014-07-03 14:13:41

标签: spring spring-el

我正在尝试使用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进行实验

2 个答案:

答案 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");
相关问题