Работа в разных контекстах с 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.

Другие вопросы по тегам