Spring 评估语言 (SpEL) 在访问映射中的无效键时不会抛出异常
Spring evaluation language (SpEL) not throw exception when accessing invalid key in 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);
}
我预计表达式会抛出异常,因为在 dictMap 上下文中没有名为 "wrongkey" 的键。但是,它打印 "null".
有什么设置可以用来强制表达式求值抛出异常吗?
谢谢
不确定为什么会有例外。
你看,在这种情况下我们有例外吗?
dictMap.get("wrongkey");
不,因为那是 Java 的工作方式。 Spring 中的 SpEL 完全基于 Java 性质。所以,这里它只委托给正常的 Java 的 Map.get()
.
要使其抛出异常,您应该在 StandardEvaluationContext
中添加一个 MapAccessor
。并且那个已经有了所需的逻辑,当没有请求的密钥时会抛出异常:
Map<?, ?> map = (Map<?, ?>) target;
Object value = map.get(name);
if (value == null && !map.containsKey(name)) {
throw new MapAccessException(name);
}
return new TypedValue(value);
我是 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".
有什么设置可以用来强制表达式求值抛出异常吗?
谢谢
不确定为什么会有例外。
你看,在这种情况下我们有例外吗?
dictMap.get("wrongkey");
不,因为那是 Java 的工作方式。 Spring 中的 SpEL 完全基于 Java 性质。所以,这里它只委托给正常的 Java 的 Map.get()
.
要使其抛出异常,您应该在 StandardEvaluationContext
中添加一个 MapAccessor
。并且那个已经有了所需的逻辑,当没有请求的密钥时会抛出异常:
Map<?, ?> map = (Map<?, ?>) target;
Object value = map.get(name);
if (value == null && !map.containsKey(name)) {
throw new MapAccessException(name);
}
return new TypedValue(value);