Acessando propriedades de beans usando o JBoss EL

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!