Неожиданное поведение MVEL2

1

Мне нужно проверить, хорошо ли написано выражение, поэтому я решил использовать 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")

Не могли бы вы дать мне объяснение?

Теги:
hashmap
mvel

1 ответ

1
Лучший ответ

У меня такая же ошибка во всех трех случаях.

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').

надеюсь, что он решает вашу путаницу.

  • 0
    Да спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню