2015-03-25 79 views
1

我們使用MVEL通過在地圖對象中傳遞地圖來評估表達式。該映射包含SNMP陷阱信息,如OID及其值。例如樣本地圖包含以下鍵和值。使用數字鍵的MVEL表達式

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. 我們是否需要向表達式中提及的鍵添加任何其他轉義字符或
  3. 這是不可能的,因爲表達式中提到的鍵不是有效的屬性/標識符。

回答

1

DOT(.)將在上述表達式中產生問題。 MVEL每個.property後內部呼叫getter

我們可以用_運營商代替.。首先還需要添加_

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中,作爲其調用getter調用鍵的鍵。 – 2015-03-26 11:32:17

+0

@AmitDandavate是Amit,MVEL對每個輸入都有意義(特殊字符等) – 2015-03-26 12:26:33

+0

那麼每個特殊字符需要多少次這樣的轉換?例如如果我在地圖中包含特殊字符「 - 」(連字符)的情況下將Key作爲「陷阱數據」,那麼它還會拋出一個錯誤,指出「[錯誤:無法訪問屬性:陷阱:無法訪問屬性:陷阱]」 。也有任何文檔參考將爲每個特殊字符輸入賦予意義嗎? – 2015-03-27 04:15:19

0

如果您使用的是Java地圖,你可以隱式調用get方法。 以下代碼將評估正確的表達式。

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