gpt4 book ai didi

Javax.el,ELResolver : Resolve dependencies between variables

转载 作者:太空宇宙 更新时间:2023-11-04 15:05:32 25 4
gpt4 key购买 nike

我正在构建一个小型应用程序来处理变量。第一步是解决变量之间的简单依赖关系。我无法让事情正常运行。我可以解析非常简单的声明,例如 a=10,但如果它变得稍微复杂一点,它总是会失败,例如:a=b; b=10。我将代码减少到以下几行:

import javax.el.BeanELResolver;
import javax.el.ELContext;
import javax.el.ELResolver;
import javax.el.ExpressionFactory;
import javax.el.FunctionMapper;
import javax.el.ValueExpression;
import javax.el.VariableMapper;

import org.jboss.el.ExpressionFactoryImpl;
import org.jboss.el.lang.VariableMapperImpl;


public void testEvalutation() throws Exception{

ExpressionFactory factory = new ExpressionFactoryImpl();
ELContext context = new ELContext() {
final ELResolver elResolver = new BeanELResolver();
final VariableMapper variableMapper = new VariableMapperImpl();
public ELResolver getELResolver() { return elResolver; }
public FunctionMapper getFunctionMapper() { return null; }
public VariableMapper getVariableMapper() { return variableMapper; }
};
ValueExpression a = factory.createValueExpression(context, "#{b}", Float.class);
ValueExpression b = factory.createValueExpression(context, "#{c}", Float.class);
ValueExpression c = factory.createValueExpression(context, "#{10}", Float.class);

context.getVariableMapper().setVariable("a",a);
context.getVariableMapper().setVariable("b",b);
context.getVariableMapper().setVariable("c",c);

ValueExpression expression = context.getVariableMapper().resolveVariable("a");
assertEquals(10f,expression.getValue(context));

}

“a”的结果是 0.0。有什么地方做错了吗?或者你知道我可以让我的代码运行的方法吗?

感谢您的建议

最佳答案

我深入研究了 EL 实现,它对表达式创建和映射的顺序很敏感。

ExpressionFactory创建 ValueExpression它解析表达式并使用 VariableMapper绑定(bind)从那里解析的任何表达式。因此,当您设置a时,它不会解析b,因为它尚未设置。

因此,#{b} 解析为 null,然后强制转换为 Float,结果为 0.0.

以下代码解析为值 10.0:

ValueExpression c = factory.createValueExpression(context, "#{10}", Float.class);
context.getVariableMapper().setVariable("c", c);
ValueExpression b = factory.createValueExpression(context, "#{c}", Float.class);
context.getVariableMapper().setVariable("b", b);
ValueExpression a = factory.createValueExpression(context, "#{b}", Float.class);
context.getVariableMapper().setVariable("a", a);

ValueExpression expression = context.getVariableMapper().resolveVariable("a");
System.out.println(expression.getValue(context));

请注意,这与解析 ELResolver 中的变量时发生的情况不同。 .

我使用了不同的实现(EL 2.2;Java EE 6 等效版本),但我希望 JBoss 实现中有类似的行为。

关于Javax.el,ELResolver : Resolve dependencies between variables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22039291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com