【问题标题】:juel expression validation (vs Janino)juel 表达式验证(与 Janino 相比)
【发布时间】:2013-05-29 08:19:05
【问题描述】:

调用所有 javax.el juel 专家 :-)

我们想使用 JUEL 来评估纯 Java 上下文中的表达式。这些表达式通常是数学表达式,由用户通过 ui 提供。另一个方面是这些表达式是配置的一部分,并且仅在稍后作为另一个过程的一部分进行评估。此外,表达式中使用的变量值仅在稍后作为此过程的一部分可用。因此,我们希望在表达式创建时向用户提供基本验证,以便用户知道他的表达式不会在评估时崩溃。

我们之前为此使用过 Janino,但我们正在用 JUEL 代替它 - 它要快得多(并且我们有 lot 的评估来达到低谷,吞吐量很重要,等等)。 JUEL 也使用完全相同的表达式语法 - 即我们可以将它插入后端并且它是向后兼容的。 (只需在旧的 Janino 表达式周围添加 ${..}

但是,JUEL 存在一个问题 - 有什么方法可以在计算所使用的表达式之前对其进行验证?

即像这样:

context.getVariableMapper().setVariable("a",expressionFactory.createValueExpression(new Double(1), double.class));

context.getVariableMapper().setVariable("b", expressionFactory.createValueExpression(new Double(2), double.class));

ValueExpression expression = expressionFactory.createExpression("${a+b}", double.class, context);

Object result = expression.getValue(context);

执行println(result) 然后正确打印出 3。

使用 Janino,我可以编写表达式 a+b,如果它格式错误或返回不正确的返回类型(即不是双精度),我会得到一个异常。然后我可以使用它来即时验证用户输入,并强制用户在例如之前更正任何错误。保存配置。

有什么方法可以用 JUEL 做到这一点吗? 或者有人知道另一种方法吗?

谢谢,

卢卡斯

【问题讨论】:

  • 如果你提出问题并得到答案,表现出某种反应总是好的风格。

标签: expression-evaluation janino juel


【解决方案1】:

当使用expressionFactory.createValueExpression("${a+b}", ...)“编译”时,表达式解析(阅读:验证)。稍后,使用 `Expression.getValue(...) 进行评估。

我建议在评估时使用ELResolver 机制来解析属性(x,y),而不是在解析时使用变量(将这些用于常量,例如 PI 等)。为此,请在评估之前使用ELContext.setValue(...) 设置属性。

请注意,您不需要在解析时和评估时使用 ELContext 的相同实例。在解析上下文中设置变量和函数,在评估上下文中设置属性。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。我最终将自己的扩展添加到了 Juel。有一个新的验证方法,它在运行之前检查每个可能的方面(据我所知)。 我提供了对 juel 的扩展,但他们认为最好将 Juel 保持在最低标准。 我打算在某个地方分享它。如果有需要,这可能会促使我尽快这样做。

    -- 赛义德

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 2018-04-28
      • 1970-01-01
      • 2020-12-09
      • 2011-11-16
      • 1970-01-01
      相关资源
      最近更新 更多