我正在构建一个小型应用程序来处理变量。 第一步是解决变量之间的简单依赖关系。 我无法让事情正常运行。 我可以解析非常简单的声明,例如 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/