带有数字键的MVEL表达式

时间:2015-03-25 11:30:13

标签: java expression mvel

我们使用MVEL通过在上下文对象中传递map来评估表达式。映射包含SNMP陷阱信息,例如OID及其值。例如示例Map包含以下键和值。

    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. 我们是否需要在表达式OR
  3. 中提到的键中添加任何其他转义字符
  4. 这是不可能的,因为表达式中提到的键不是有效的属性/标识符。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)));