1

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

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

我们之前使用过 Janino,但我们正在用 JUEL 替换它 - 它更快(并且我们有很多评估要达到低谷,吞吐量很重要等)。此外,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 做到这一点?或者有人知道另一种方法吗?

谢谢,

卢卡斯

4

2 回答 2

0

expressionFactory.createValueExpression("${a+b}", ...). _ 稍后,使用 `Expression.getValue(...) 进行评估。

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

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

于 2013-05-29T13:26:49.933 回答
0

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

——赛义德

于 2013-10-02T08:46:25.393 回答