我们使用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验证其值。基于此,我们需要知道
答案 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)));