春季评估语言(SPEL)在访问MAP中无效键时不会引发异常



我是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);
}

我期望该表达式应该引发异常,因为在DIDMAP上下文中没有名为"错误键"的键。但是,它打印" null"。

我可以使用任何设置来强制表达式评估抛出异常吗?

谢谢

不确定为什么应该有例外。

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

dictMap.get("wrongkey");

不,因为这就是Java的工作方式。春季的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);

最新更新