致电所有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做到这一点吗? 或者有人知道另一种方法吗?
谢谢,
的Lukas
答案 0 :(得分:0)
使用expressionFactory.createValueExpression("${a+b}", ...)
“编译”时,表达 解析(读取:验证)。之后,使用`Expression.getValue(...)。
我建议使用ELResolver
机制在评估时解析属性(x,y),而不是在解析时使用变量(将这些用于常量,例如PI等)。为此,请使用ELContext.setValue(...)
在评估之前设置属性。
请注意,您无需在分析时和评估时使用相同的ELContext
实例。在您的解析上下文中设置变量和函数,并在评估上下文中设置属性。
答案 1 :(得分:0)
我遇到了同样的问题。我最终将我自己的扩展添加到了Juel。在运行它之前,有一个新的验证方法可以检查每个可能的方面(据我所知)。 我向juel提出了延期,但他们认为将Juel保持在最低标准是更好的。 我打算有时在某个地方分享它。如果有需要,这可能会促使我早点做到。
- 赛义德