2016-03-01 92 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版本 - 那你在用什么? –

相关问题