MVEL выражение с помощью цифровых клавиш

1

Мы используем MVEL для оценки выражения путем передачи карты в объект контекста. Карта содержит информацию о ловушке SNMP, такую как OID и ее значения. например, образец карты содержит следующие ключи и значения.

    Map<String,String> trapMap = new HashMap();
    trapMap.put("1.3.6.1.4.1.9.9.311.1.1.2.1.3", "(7362915) 20:27:09.15");
    trapMap.put("1.3.6.1.4.1.9.9.311.1.1.2.1.2", "2.2");
    trapMap.put("1.3.6.1.4.1.9.9.311.1.1.2.1.19", "0");
    trapMap.put("1.3.6.1.4.1.9.9.311.1.1.2.1.16", "SIMPLE TRAP --Port Down due to Admin Status down");
    trapMap.put("errorStatus", "0");
    trapMap.put("IPAddress", "10.127.34.219");

Когда мы вычисляем выражение с использованием MVEL.eval(), он либо терпит неудачу, либо возвращает False. Ниже приведено выражение MVEL и его результат.

    System.out.println("----------########### = "+(MVEL.eval("1.3.6.1.4.1.9.9.311.1.1.2.1.19 == '0'", trapMap)));
    //Throws error as 
    //Exception in thread "main" [Error: invalid number literal: 1.3.6.1.4.1.9.9.311.1.1.2.1.19]
    //      [Near : {... 1.3.6.1.4.1.9.9.311.1.1.2.1.19 == '0 ....}]

    System.out.println("----------########### = "+(MVEL.eval("\"1.3.6.1.4.1.9.9.311.1.1.2.1.19\" == '0'", trapMap)));
    //Enclosed trap OID in double quotes and compared with String value then it returns false

    System.out.println("----------########### = "+(MVEL.eval("\"1.3.6.1.4.1.9.9.311.1.1.2.1.19\" == 0", trapMap)));
    //Enclosed trap OID in double quotes and compared with number then it returns false

Наша карта всегда будет содержать такие OID и значения, и мы хотим проверить их значения с помощью MVEL. Исходя из этого, нам нужно знать

  1. если указанное выражение является допустимым выражением, если нет, то какие изменения необходимы, чтобы заставить его работать.
  2. Нужно ли добавлять какие-либо дополнительные escape-символы к ключам, указанным в выражении ИЛИ
  3. Это невозможно, так как ключ, упомянутый в выражении, является недопустимым свойством/идентификатором.
Теги:
expression
mvel

2 ответа

1

DOT(.) Создаст проблему в выражении выше. MVEL внутренне вызывает getter после каждого . property.

мы можем заменить . с оператором _. Также необходимо добавить _ в начало.

public static void main(String args[]) throws Exception {
        String s = "1.3.6.1.4.1.9.9.311.1.1.2.1.19 == 0";

        Map<String, String> trapMap = new HashMap();
        trapMap.put(convertDot("1.3.6.1.4.1.9.9.311.1.1.2.1.3"), "(7362915) 20:27:09.15");
        trapMap.put(convertDot("1.3.6.1.4.1.9.9.311.1.1.2.1.2"), "2.2");
        trapMap.put(convertDot("1.3.6.1.4.1.9.9.311.1.1.2.1.19"), "0");
        trapMap.put(convertDot("1.3.6.1.4.1.9.9.311.1.1.2.1.16"), "SIMPLE TRAP --Port Down due to Admin Status down");
        trapMap.put("errorStatus", "0");
        trapMap.put("IPAddress", "10.127.34.219");
        System.out.println(MVEL.eval(convertDot(s), trapMap));

    }

    public static String convertDot(String input) {
        input = "_" + input.replaceAll("\\.", "_");
        return input;
    }

вывод

true
  • 0
    Это означает, что нам нужно поместить ключи в Map, следуя правилам соглашения об именовании свойств / идентификаторов, поскольку вызывающий геттер вызывает ключи.
  • 0
    @AmitDandavate yes Amit, также MVEL имеет значение для каждого ввода (специальные символы и т. Д.)
Показать ещё 2 комментария
0

Если вы используете Java Map, вы можете неявно вызвать метод get. Следующий код будет оценивать правильное выражение.

System.out.println("----------########### = "+(MVEL.eval("get(\"1.3.6.1.4.1.9.9.311.1.1.2.1.19\") == '0'", trapMap)));

Ещё вопросы

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