Javax.el,ELResolver : Resolve dependencies between variables

标签 java variables jboss el

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

相关文章:

java - OpenJDK 8 是 Java SE 8 的引用实现吗?

javascript - Typescript - 如何从变量对象访问变量对象属性

bash - 变量替换(你怎么称呼/命名这个方法)?

java - beans.xml 上的文件过早结束

java - 选择更新不起作用

java - 了解议程组的锁定 Activity

java - 指定 Hibernate 的 aliasToBean 使用的 setter

java - 无锁执行 Select HQL?

java - 在 Spring Security 3.0.2 中从数据库加载拦截 url

java - 声明实例变量并实现 getter 方法?