SpEL - 禁用短路评估

时间:2018-03-22 14:55:48

标签: java spring spring-el

在我的应用程序中,我有几个SpEL表达式的对象,这些表达式通常包含具有boolean返回类型的方法的签名以及逻辑运算符。在缓存这些对象之前,我只需执行解析后的表达式即可检查表达式的一致性。抛出异常时,我在对象内部设置了一个适当的标志,表明该表达式无效,以避免进一步执行。

我正在EvaluationContext上执行表达式,该表达式实现了允许作为表达式一部分的所有方法。所有这些方法都返回false。我遇到了一个涉及短路评估的问题。

鉴于methodOnemethodTwo是唯一允许调用的方法,此表达式正确设置了不一致标志

methodERROROne("arg") AND methodTwo("arg")
但是,这个不是因为methodOne返回falseSpring使用短路评估而不执行剩余的操作数。这会导致表达式在真实EvaluationContext上执行时失败,methodOne返回true

methodOne("arg") AND methodERRORTwo("arg")

有没有办法禁用短路评估是Spring表达式语言?

1 个答案:

答案 0 :(得分:1)

没有; OpAnd运算符总是短路......

@Override
public TypedValue getValueInternal(ExpressionState state) throws EvaluationException {
    if (!getBooleanValue(state, getLeftOperand())) {
        // no need to evaluate right operand
        return BooleanTypedValue.FALSE;
    }
    return BooleanTypedValue.forValue(getBooleanValue(state, getRightOperand()));
}

......没有相当于Java的&运营商。

修改

  

所有这些方法都返回false

如果他们全部归还false,您是否可以使用"!(!m1() and !m2())"

甚至

"!((!m1() or m1()) and (!m2() or m2()))"