Java SpEL-禁用短路评估
在我的应用程序中,我有几个带有Java SpEL-禁用短路评估,java,spring,spring-el,Java,Spring,Spring El,在我的应用程序中,我有几个带有SpEL表达式的对象,这些表达式通常包含带有boolean要调用的返回类型和逻辑运算符的方法的签名。在缓存这些对象之前,我只需执行解析后的表达式即可检查表达式的一致性。当抛出异常时,我在对象内部设置了一个适当的标志,指示表达式无效,以避免进一步执行 我正在EvaluationContext上执行表达式,该表达式实现了允许作为表达式一部分的所有方法。所有这些方法都返回false。我遇到了一个涉及短路评估的问题 鉴于methodOne和methodTwo是唯一允许调用的
SpEL
表达式的对象,这些表达式通常包含带有boolean
要调用的返回类型和逻辑运算符的方法的签名。在缓存这些对象之前,我只需执行解析后的表达式即可检查表达式的一致性。当抛出异常时,我在对象内部设置了一个适当的标志,指示表达式无效,以避免进一步执行
我正在EvaluationContext
上执行表达式,该表达式实现了允许作为表达式一部分的所有方法。所有这些方法都返回false
。我遇到了一个涉及短路评估的问题
鉴于methodOne
和methodTwo
是唯一允许调用的方法,此表达式正确设置了不一致性标志
methodERROROne("arg") AND methodTwo("arg")
但是,这一个没有,因为methodOne
返回false
,Spring
使用短路求值,并且不执行剩余的操作数。这会导致表达式在realEvaluationContext
上执行时失败,methodOne
返回true
methodOne("arg") AND methodERRORTwo("arg")
是否有一种禁用短路评估的方法是Spring表达式语言?否;
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()和!m2())”
甚至
“!(!m1()或m1())和(!m2()或m2())”
请参见对我的答案的编辑-如果所有方法都返回false,则可以对它们进行否定,以强制对它们进行求值。问题是,我不想因此而禁用短路求值或修改SpEL
表达式。对于真实环境下的评估,短路评估在性能方面非常方便。我想可能有一种方法可以在一次特定的评估中禁用它。当我检查表达式的一致性时,这些方法仅返回false,否则返回值取决于上下文。然而,说明没有办法进行Spring
suppress short circuit求值是一个充分的答案。非常感谢。