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

我们的 Map 将始终包含这样的 OID 和值,我们希望使用 MVEL 验证它们的值。基于此,我们需要知道

  1. 如果提到的表达式是有效的表达式,如果不是,那么需要进行哪些更改才能使其工作。
  2. 我们是否需要向表达式中提到的键添加任何额外的转义字符或
  3. 这是不可能的,因为表达式中提到的键不是有效的属性/标识符。
4

2 回答 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
于 2015-03-26T07:51:29.793 回答
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)));
于 2015-03-28T02:58:21.617 回答