Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpEL-禁用短路评估_Java_Spring_Spring El - Fatal编程技术网

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
使用短路求值,并且不执行剩余的操作数。这会导致表达式在real
EvaluationContext
上执行时失败,
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求值是一个充分的答案。非常感谢。