我有一个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,表达式等),此问题不会影响包含感叹号的键或其他我能想到的特殊字符测试。
答案 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'}")
打印精美