在我的应用程序中,我有几个SpEL
表达式的对象,这些表达式通常包含具有boolean
返回类型的方法的签名以及逻辑运算符。在缓存这些对象之前,我只需执行解析后的表达式即可检查表达式的一致性。抛出异常时,我在对象内部设置了一个适当的标志,表明该表达式无效,以避免进一步执行。
我正在EvaluationContext
上执行表达式,该表达式实现了允许作为表达式一部分的所有方法。所有这些方法都返回false
。我遇到了一个涉及短路评估的问题。
鉴于methodOne
和methodTwo
是唯一允许调用的方法,此表达式正确设置了不一致标志
methodERROROne("arg") AND methodTwo("arg")
但是,这个不是因为methodOne
返回false
,Spring
使用短路评估而不执行剩余的操作数。这会导致表达式在真实EvaluationContext
上执行时失败,methodOne
返回true
methodOne("arg") AND methodERRORTwo("arg")
有没有办法禁用短路评估是Spring表达式语言?
答案 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()))"