Olá Pessoal!
Estou tentando usar a API de EL do JBoss para fazer a avaliação de expressões.
Criei a seguinte class utilitária:
import java.lang.reflect.Method;
import java.util.Map;
import javax.el.FunctionMapper;
import javax.el.ValueExpression;
import javax.el.VariableMapper;
import org.jboss.el.ExpressionFactoryImpl;
import org.jboss.el.ValueExpressionLiteral;
import org.jboss.el.lang.EvaluationContext;
import org.jboss.el.lang.FunctionMapperImpl;
import org.jboss.el.lang.VariableMapperImpl;
public class ELUtils {
private static FunctionMapper buildFunctionMapper(Map<String, Method> functionMethodMap){
FunctionMapperImpl mapper = new FunctionMapperImpl();
for(String functionName : functionMethodMap.keySet()){
mapper.addFunction("", functionName, functionMethodMap.get(functionName));
}
return mapper;
}
private static VariableMapper buildVariableMapper(Map<String, Object> attributeMap){
VariableMapperImpl mapper = new VariableMapperImpl();
for(String attributeName : attributeMap.keySet()){
Class clazz = Object.class;
if(attributeMap.get(attributeName) != null)
clazz = attributeMap.get(attributeName).getClass();
ValueExpressionLiteral expression = new ValueExpressionLiteral(attributeMap.get(attributeName), clazz);
mapper.setVariable(attributeName, expression);
}
return mapper;
}
public static EvaluationContext buildEvaluationContext(Map<String, Method> functionMethodMap,
Map<String, Object> attributeMap){
return new EvaluationContext(null, buildFunctionMapper(functionMethodMap),
buildVariableMapper(attributeMap));
}
public static Boolean evaluateBooleanExpression(EvaluationContext elContext, String expression){
ValueExpression result = new ExpressionFactoryImpl().createValueExpression(
elContext, expression, Boolean.class);
return (Boolean) result.getValue(elContext);
}
}
Criei o seguinte código:
public class JBossELTest {
public static void main(String[] args) {
HashMap<String, Object> attributeMap = new HashMap<String, Object>();
attributeMap.put("bean", new ExampleBean("text",23));
EvaluationContext ec = ELUtils.buildEvaluationContext(new HashMap<String, Method>(), attributeMap);
boolean bool = ELUtils.evaluateBooleanExpression(ec, "#{bean.text eq 'text'}");
System.out.println(bool);
}
}
Considerando que a classe ExampleBean é um bean com duas propriedades (text e number) pela documentação da EL era para funcionar corretamente.
Porém eu recebo a seguinte exceção:
Exception in thread "main" java.lang.NullPointerException
at org.jboss.el.lang.EvaluationContext.getELResolver(EvaluationContext.java:58)
at org.jboss.el.lang.EvaluationContext.getELResolver(EvaluationContext.java:58)
at org.jboss.el.parser.AstPropertySuffix.getValue(AstPropertySuffix.java:51)
at org.jboss.el.parser.AstValue.getValue(AstValue.java:67)
at org.jboss.el.parser.AstEqual.getValue(AstEqual.java:21)
at org.jboss.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
at net.sf.systemglue.utils.ELUtils.evaluateBooleanExpression(ELUtils.java:49)
at JBossELTest.main(JBossELTest.java:18)
Na verdade o problema está na avaliação de propriedades. Se eu acessar pelo método chamando “#{bean.getText() eq ‘text’}”, funciona normalmente.
Qualquer ajuda é válida:
- Sugestão de uma outra implementação de EL
- Sugestão de mais material sobre a API de EL do JBoss (muito pouco material disponível)
- Solução do problema
Desde já agradeço qualquer ajuda!