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

升级到Java11/WildFly22后JSP EL用eq/==比较不同类型对象抛出异常

问题原因

这个行为变化是WildFly版本迭代中,内置的表达式语言(EL)实现的规则调整导致的:

  • WildFly 12使用的是EL 3.0早期实现,该版本针对Number类型和String类型的等值比较做了兼容处理:如果String无法转换为合法数值,会直接返回false,不会抛出异常。
  • WildFly 22内置的是org.glassfish.jakarta.el@3.0.3版本的EL实现,该版本严格遵循Jakarta EE EL规范要求:当eq/==运算符两侧分别为Number类型和String类型时,必须先将String强制转换为数值再进行比较,转换失败就会抛出NumberFormatException。
解决方案

针对老项目存在大量跨类型EL比较的场景,有以下两种处理方式:

应急兼容方案(无需修改业务代码)

开启EL实现的旧版本兼容开关,在WildFly的启动参数中添加如下JVM参数即可:

-Dorg.glassfish.el.coerceToNumberIgnoreFailure=true

开启后,当字符串转数值失败时会自动回到旧版本逻辑,直接返回false,不会抛出异常。

长期优化方案

如果后续有迭代重构的计划,可以逐步整改历史代码:

  1. 批量扫描所有JSP、JSTL文件中的eq/==运算,排查两侧类型不匹配的逻辑
  2. 将跨类型比较提前统一类型,例如把数值先转为字符串再做比较:"${1.toString() eq 'mystring'}"
  3. 针对需要判断数值是否在字符串列表的场景,替换为更严谨的集合包含判断逻辑,避免跨类型比较

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:57:01