SpEL - 禁用短路评估

SpEL - disable short circuit evaluation

在我的应用程序中,我的对象有几个 SpEL 表达式,这些表达式通常包含要调用的 boolean return 类型的方法签名和逻辑运算符。在缓存这些对象之前,我通过简单地执行已解析的表达式来检查表达式的一致性。当抛出异常时,我在对象内部设置一个适当的标志来指示表达式无效以避免进一步执行。

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

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

methodERROROne("arg") AND methodTwo("arg")
然而,

这个没有,因为methodOne returns falseSpring使用短路评估并且不执行剩余的操作数。这会导致表达式在真正的 EvaluationContextmethodOne returns true

上执行时失败
methodOne("arg") AND methodERRORTwo("arg")

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

没有; OpAnd 运算符总是 short-circuits...

@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 的 & 运算符。

编辑

All these methods return false

如果他们都return false你不能使用"!(!m1() and !m2())"吗?

甚至

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