在地图中访问无效密钥时,Spring评估语言(SpEL)不会抛出异常

时间:2017-09-13 10:16:49

标签: java spring-el

我是SpEL的新手,下面是我用于测试的示例可行测试。

public static void main(String[] args) {

    Map<String,String> dictMap = new HashMap<>();
    dictMap.put("key", "value");
    Map<String, Object> rootObj = new HashMap<>();
    rootObj.put("d", dictMap);

    ExpressionParser parser = new SpelExpressionParser();
    Expression exp = parser.parseExpression("['d']['wrongkey']");
    String msg = (String) exp.getValue(new StandardEvaluationContext(rootObj), String.class);
    System.out.println(msg);
}

我预计表达式应该抛出异常,因为dictMap上下文中没有名为“wrongkey”的键。但是,它打印“null”。

是否有任何设置可用于强制表达式求值抛出异常?

谢谢

1 个答案:

答案 0 :(得分:0)

不确定为什么会有例外。

看,这种情况下我们有例外吗?

dictMap.get("wrongkey");

不,因为这就是Java的工作原理。 Spring中的SpEL完全基于Java性质。所以,在这里它只委托给普通的Java Map.get()

要使其抛出异常,您应该添加到StandardEvaluationContext a MapAccessor。并且那个已经具有所需的逻辑,当没有请求密钥时抛出异常:

Map<?, ?> map = (Map<?, ?>) target;
Object value = map.get(name);
if (value == null && !map.containsKey(name)) {
    throw new MapAccessException(name);
}
return new TypedValue(value);