Проверка правильности выражения (против Янино)
Обзвонив всех экспертов по javax.el juel:-)
Мы хотим использовать JUEL для оценки выражений в чистом контексте Java. Эти выражения обычно являются математическими и предоставляются пользователями через пользовательский интерфейс. Дополнительным аспектом является то, что эти выражения являются частью конфигурации и оцениваются только позже как часть другого процесса. Кроме того, значения переменных, используемые в выражениях, доступны только позже как часть этого процесса. Таким образом, мы хотим предоставить пользователю базовую проверку во время создания выражения, чтобы пользователь знал, что его выражение не упадет во время оценки.
Раньше мы использовали для этого Janino, но мы заменили это на JUEL - это намного быстрее (и у нас много оценки, чтобы понять, важна пропускная способность и т. Д.). Также JUEL работает с точно таким же синтаксисом выражений - то есть мы можем подключить его к бэкэнду, и он будет обратно совместим. (Просто надо добавить ${..}
вокруг старых выражений Янино.
Однако у нас есть одна проблема с JUEL - есть ли способ проверить правильность используемого выражения перед его оценкой?
Т.е. как то так:
context.getVariableMapper().setVariable("a",expressionFactory.createValueExpression(new Double(1), double.class));
context.getVariableMapper().setVariable("b", expressionFactory.createValueExpression(new Double(2), double.class));
ValueExpression expression = expressionFactory.createExpression("${a+b}", double.class, context);
Object result = expression.getValue(context);
Делать println(result)
затем правильно распечатывает 3.
С Янино я мог приготовить выражение a+b, и если оно было искажено или вернуло бы неправильный тип возврата (то есть не удвоенный), я бы получил исключение. Затем я мог бы использовать это для проверки ввода пользователя на лету и заставить пользователя исправить любые ошибки, например, перед сохранением конфигурации.
Есть ли способ сделать это с JUEL? Или кто-нибудь знает об альтернативном подходе?
Спасибо,
Lukas
2 ответа
У меня была та же проблема. В итоге я добавил свое собственное расширение к Juel. Существует новый проверочный метод, который проверяет каждый возможный аспект (насколько я мог найти) перед его запуском. Я предложил расширить Джуел, но они решили, что лучше придерживаться минимума Джуела на уровне стандарта. Я планировал поделиться этим где-нибудь когда-нибудь. Если есть необходимость, это может побудить меня сделать это раньше.
- Саид
Выражение анализируется (читай: проверено) при "компиляции" с expressionFactory.createValueExpression("${a+b}", ...)
, Позже оценка происходит с помощью `Expression.getValue(...).
Я бы предложил использовать ELResolver
механизм разрешения свойств (x, y) во время оценки вместо использования переменных (используйте их для констант, например, PI и т. д.) во время анализа. Для этого установите свойства перед оценкой, используя ELContext.setValue(...)
,
Обратите внимание, что вам не нужно использовать один и тот же экземпляр ELContext
во время анализа и оценки времени. Установите переменные и функции в вашем контексте анализа и свойства в вашем контексте оценки.