Мне нужно проверить, хорошо ли написано выражение, поэтому я решил использовать MVEL2 для этого. У меня есть выражение, подобное
String expression = "(OPVAL == 'OPERATION') && (DAT > '12345')"
и хэш-карту, подобную
Map<String, Object> vars = new HashMap<String, Object>();
{OPVAL = "OPERATION", DATA = "0"}
Когда я обрабатываю его с помощью MVEL,
(Boolean)MVEL.eval(expression, vars);
Я ожидаю исключения, потому что DAT не отображается, вместо этого библиотека MVEL2 возвращает только условие FALSE.
Если я использую выражение типа
String expression = (DAT > '15/11/2014') && (OPVAL == 'Operazione')
Я получаю ожидаемое исключение, и еще один пример, где я получаю исключение:
String expression = (OPVAL != "Operazione") AND (DAT < "15/11/2014")
Не могли бы вы дать мне объяснение?
У меня такая же ошибка во всех трех случаях.
unresolvable property or identifier: DAT
Помните - при оценке выражения "(OPVAL == 'OPERATION') && (DAT > '12345')"
MVEL использует структуру AST tree
для анализа любого данного выражения и затем оценки.
Кроме того, если (OPVAL == 'OPERATION')
является ложным, то он никогда не будет оценивать (DAT > '12345')
так как между ними есть оператор &&
.
Осторожно посмотрите еще раз, и играйте с вашим выражением, или двигайтесь (DAT > '12345')
спереди, а затем проверяйте.
FYI, см. Ниже код
Дело 1
public static void main(String args[]) throws Exception {
String expression = "(OPVAL == 'OPERATION') && (DAT > '12345')";
Map<String, Object> vars = new HashMap<String, Object>();
vars.put("OPVAL", "OPERATION1");
vars.put("DATA", "0");
System.out.println(MVEL.eval(expression, vars));
}
Вывод
false
Поскольку (OPVAL == 'OPERATION')
оценивается как false.
Случай 2
public static void main(String args[]) throws Exception {
String expression = "(OPVAL == 'OPERATION') && (DAT > '12345')";
Map<String, Object> vars = new HashMap<String, Object>();
vars.put("OPVAL", "OPERATION");
vars.put("DATA", "0");
System.out.println(MVEL.eval(expression, vars));
}
вывод
Exception in thread "main" [Error: unresolvable property or identifier: DAT]
[Near : {... (OPVAL == 'OPERATION') && (DAT > '12345') ....}]
Так как в этом случае (OPVAL == 'OPERATION')
оценивается как true, значит, он далее проходит оценку (DAT > '12345')
.
надеюсь, что он решает вашу путаницу.