【问题标题】:SpEL - disable short circuit evaluationSpEL - 禁用短路评估
【发布时间】:2018-09-01 01:52:16
【问题描述】:

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

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

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

methodERROROne("arg") AND methodTwo("arg")

然而,这不是因为methodOne 返回falseSpring 使用短路评估并且不执行剩余的操作数。这会导致表达式在实际 EvaluationContext 上执行时失败,methodOne 返回 true

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

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

【问题讨论】:

  • 查看我的答案的编辑 - 如果您的所有方法都返回 false,您可以否定它们以强制对它们进行评估。

标签: java spring spring-el


【解决方案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()))"

【讨论】:

  • 问题是,我不想因此禁用短路评估或修改SpEL 表达式。对于真实环境的评估,短路评估在性能方面派上用场。我认为可能有一种方法可以为一个特定的评估禁用它。这些方法只有在我检查表达式的一致性时才返回false,否则返回值取决于上下文
  • 但是,说明没有办法让Spring 抑制短路评估就足够了。谢谢
猜你喜欢
  • 1970-01-01
  • 2015-11-14
  • 2017-01-21
  • 2012-02-10
  • 2010-12-21
  • 1970-01-01
  • 2019-12-15
  • 2013-05-21
  • 2013-12-23
相关资源
最近更新 更多