致电所有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一起做这事?还是有人知道另一种方法?
谢谢,
卢卡斯
发布于 2013-05-29 13:26:49
表达式在使用expressionFactory.createValueExpression("${a+b}", ...)
“编译”时被解析(read: validated)。稍后,评估将发生在`Expression.getValue(.)中。
我建议在计算时使用ELResolver
机制来解析属性(x,y),而不是在解析时使用变量(用于常量,例如PI等)。为此,在使用ELContext.setValue(...)
进行计算之前设置属性。
请注意,您不需要在解析时和计算时使用相同的ELContext
实例。在解析上下文中设置变量和函数,在评估上下文中设置属性。
发布于 2013-10-02 08:46:25
我也有同样的问题。最后我给朱尔增加了我自己的分店。有一种新的验证方法,它在运行之前检查每个可能的方面(尽可能多)。我向juel提供了扩展服务,但他们认为最好是将Juel保持在最低水平。我本来打算找个地方分享的。如果需要的话,这可能会促使我更早地去做这件事。
-萨伊德
https://stackoverflow.com/questions/16808775
复制相似问题