You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EL中访问含null键的Map时,方括号与get方法表现差异咨询

EL中Map空键的方括号语法与get方法差异解析

这不是EL的bug,而是符合EL的设计逻辑。

核心原因:EL方括号对null键的特殊处理

EL规范明确规定,使用map[key]方括号语法时,若key为null,会被自动转换为字符串"null"作为键去Map中查找,而非直接使用null本身。而Java原生的map.get(key)方法则会直接传递null作为键,完全遵循Map的原生行为。

对应到你的场景:

  • 当person为null时,#{bean.byPerson[person][svc]}实际等价于调用byPerson.get("null").get(svc),但你的Map中只有null键,不存在"null"字符串键,因此找不到对应值,EL对null值默认渲染为空字符串,所以返回空白。
  • 而#{bean.byPerson.get(person)[svc]}直接调用Java的get(null),匹配到Map中存在的null键,自然能正常返回对应数值。

直观验证方法

你可以在后台代码中添加测试逻辑:

// 同时添加null键和"null"字符串键
Map<String, Integer> nullKeyMap = new HashMap<>();
nullKeyMap.put("svc1", 100);
Map<String, Integer> stringNullKeyMap = new HashMap<>();
stringNullKeyMap.put("svc1", 200);

byPerson.put(null, nullKeyMap);
byPerson.put("null", stringNullKeyMap);

此时页面中测试:

  • #{bean.byPerson[person][svc1]}(person为null)会返回200
  • #{bean.byPerson.get(person)[svc1]}会返回100,能直接看到两种语法的差异。

总结

EL方括号语法对null键的转换是规范定义的行为,目的是统一处理空值场景的歧义。如果需要操作Map的null键,必须使用Java原生的get()方法调用。

内容的提问来源于stack exchange,提问作者Edward

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 19:12:13