使用包含单引号

时间:2016-03-01 14:21:42

标签: spring spring-mvc el

我有一个Java HashMap<String,String>,它通过Spring的itemTypesByKey提供给JSP页面(ModelAndView),以及一个包含密钥列表的单独结构。 (这些键可能会也可能不会导致有效查找。)我枚举这些键,并从地图中获取值。

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,表达式等),此问题不会影响包含感叹号的键或其他我能想到的特殊字符测试。

1 个答案:

答案 0 :(得分: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'}")

线程“main”中的异常org.springframework.expression.spel.SpelParseException:EL1045E:(pos 33):找不到终止“for string

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'}")

打印精美