2016-03-01 90 views
3

我有一個Java HashMap<String,String>,它通過Spring的ModelAndView提供給JSP頁面(itemTypesByKey),並且包含一個包含鍵列表的單獨結構。 (這些鍵可能導致或不導致有效的查找。)我枚舉這些鍵,並從地圖中獲取值。使用包含單引號的字符串鍵的EL映射查找

Map<String, String> itemTypes = new HashMap<>(); 
itemTypes.put("NormalValue", "INGREDIENT"); 
itemTypes.put("Apostro'Value", "INGREDIENT"); 
ModelAndView mav = ... 
mav.addObject("itemTypesByKey", itemTypes); 

問題我看到的是,如果我的鑰匙包含撇號,查找失敗。

我的代碼(用於調試目的):

Key Name: ${currentKeyName} 
Not Empty: ${not empty itemTypesByKey[currentKeyName]} 
Type: ${itemTypesByKey[currentKeyName]} 
All Suite Types: ${itemTypesByKey} 

結束了打印,支持兩個獨立的按鍵:

Key Name: NormalValue 
Not Empty: true 
Type: INGREDIENT 
All Suite Types: {NormalValue=INGREDIENT, Apostro'Value=INGREDIENT} 

Key Name: Apostro'Value 
Not Empty: false 
Type: 
All Suite Types: {NormalValue=INGREDIENT, Apostro'Value=INGREDIENT} 

時,他們用來查找一個我明白逃避撇文字值,但爲什麼如果我的密鑰包含撇號,這會失敗?無論我的密鑰的值是否包含特殊字符,如何安全地在我的映射中執行查找?我使用的是Spring 3.1.4版本(mvc,表達式等),並且這個問題不會影響包含感嘆號的關鍵字,或者其他我認爲可以測試的特殊字符。

+0

由於APOSTROPH將轉換成thier代碼(')。與引號相同的問題=(。 – reporter

+0

不應該在任何內容被打印到頁面之前發生內部查找? –

+0

實際上是的,但'實際上'實際上不是一個字^^ – reporter

回答

2

下面是一些測試結果。爲了在密鑰中使用撇號,必須使用兩個單引號。最重要的是,一個單引號或者特殊字符(感嘆號,雙引號等)的關鍵字需要用單引號括起來。底線是用單引號圍住您的密鑰&如果您的密鑰中有單引號,則使用兩個單引號。

public static void main(String[] args) { 
    ExpressionParser parser = new SpelExpressionParser(); 
    Map<String,String> itemTypes = (Map) parser.parseExpression("{NormalValue:'INGREDIENT',ApostroValue:'INGREDIENT'}").getValue(); 
    for (Map.Entry<String, String> e : itemTypes.entrySet()) 
     System.out.println(e.getKey() + ": " + e.getValue()); 
} 

打印鍵&值精細

parseExpression("{NormalValue:'INGREDIENT',Apostro'Value:'INGREDIENT'}") 

異常線程 「main」 org.springframework.expression.spel.SpelParseException:EL1046E:(POS 51):找不到終止字符串

parseExpression("{NormalValue:'INGREDIENT',Apostro''Value:'INGREDIENT'}") 

線程「main」中的異常org.springframework.expression.spel.SpelParseException:EL1043E:(pos 33):意外的標記。預期 '冒號(:)',但是 'literal_string'

parseExpression("{NormalValue:'INGREDIENT','Apostro''Value':'INGREDIENT'}") 

打印細

parseExpression("{NormalValue:'INGREDIENT',Apostro\"Value:'INGREDIENT'}") 

異常在線程 「主」 org.springframework.expression.spel.SpelParseException:EL1045E:(POS 33) :找不到終止「字符串

parseExpression("{NormalValue:'INGREDIENT','Apostro\"Value':'INGREDIENT'}") 

打印精細

parseExpression("{NormalValue:'INGREDIENT',Apostro!Value:'INGREDIENT'}") 

線程「main」中的異常org.springframework.expression.spel.SpelParseException:EL1043E:(pos 33):意外的標記。預期'冒號(:)'但是'不是(!)」

parseExpression("{NormalValue:'INGREDIENT','Apostro!Value':'INGREDIENT'}") 

打印細

+0

我很感謝你的回答Zack,但我在我的機器上看到了不同的行爲。 (使用Spring Expression 3.1.4)https://gist.github.com/craigotis/6f3cfaf29ecde4b0c63a –

+0

@CraigOtis奇怪......當我複製你的要點並運行它時,它們都傳遞給我 –

+0

這很可能與Spring Expression版本 - 那你在用什麼? –

相關問題