Работа в разных контекстах с JUEL
Я работал над выражениями и пытался поиграть с контекстами (тот, который мы используем во время создания, и тот, который мы используем во время оценки). Ниже приведен код, который пытается воспроизвести мои потребности и выделить проблему.
ExpressionFactory factory = new ExpressionFactoryImpl();
SimpleContext createContext = new SimpleContext();
createContext.setVariable("myBean", factory.createValueExpression(new MyBean("Laurent"), MyBean.class));
String expression;
expression = "${myBean.foo} ${exchange.host}";
ValueExpression expr = factory.createValueExpression(createContext, expression, String.class);
System.out.println("expr Class : " + expr.getClass());
SimpleContext evalContext = new SimpleContext();
List<String> hosts = asList("www.example.com", "www.foo.com", "www.bar.com");
// I want to evaluate the same expression, but with different values for the variable exchange.
for (String host : hosts) {
evalContext.setVariable("exchange", factory.createValueExpression(new MyExchange(host), MyExchange.class));
System.out.println(expression + " = " + expr.getValue(evalContext));
}
Я настроил базовый проект Maven по https://github.com/laurentvaills/test-juel-expression чтобы воспроизвести его.
Можете ли вы сказать мне, почему я получил следующую ошибку: javax.el.PropertyNotFoundException: Cannot find property exchange ?
1 ответ
Решение
Это не проблема JUEL, а общий вопрос EL. Переменные связаны во время разбора. После анализа выражения их нельзя изменить. Во время оценки вам нужно использовать свойства:
evalContext.getELResolver().setValue(
evalContext,
null,
"exchange",
new MyExchange(host));
Подробности смотрите в документации по ELResolver.