WildFly升级至26.1.3后JSF1.2页面EL表达式抛出数字格式异常
问题分析与解决方案
问题原因
WildFly 26.1.3默认使用EL 3.0+规范,而旧版WildFly 14使用EL 2.2,两者类型转换逻辑存在差异:
- EL 2.2中
!=运算符比较字符串与其他类型时,优先按字符串规则处理; - EL 3.0+中
!=会尝试将两边操作数强制转为数字比较,当字符串"N"无法转为数字时,就抛出NumberFormatException。
你提到已排除WildFly的JSF模块但问题未解决,大概率是EL模块未被正确排除,或应用类加载顺序导致仍使用容器自带的高版本EL。
解决方案
1. 修改EL表达式,显式指定字符串比较
将原表达式${app.flag!='N'}替换为以下任意一种:
- 使用EL标准不等运算符
ne,严格按类型比较:${app.flag ne 'N'} - 直接调用字符串
equals方法:${!app.flag.equals('N')}
2. 全局关闭EL自动类型转换
在web.xml中添加上下文参数,禁用EL自动强制类型转换:
<context-param> <param-name>javax.el.coercion.enabled</param-name> <param-value>false</param-value> </context-param>
注意:此配置全局生效,需验证其他EL表达式是否受影响。
3. 确保后端返回正确类型
检查app.flag的后端实现,确保它返回String类型。如果后端设计为布尔值,应直接比较布尔值:
${app.flag} <!-- 若flag为布尔值,直接判断true/false -->
4. 正确排除WildFly的JSF和EL模块
若需继续使用JSF 1.2和EL 2.2,在jboss-deployment-structure.xml中完整排除容器自带模块,并将对应版本jar包放入WEB-INF/lib:
<jboss-deployment-structure> <deployment> <exclude-subsystems> <subsystem name="jsf"/> </exclude-subsystems> <exclusions> <module name="javax.faces.api"/> <module name="com.sun.jsf-impl"/> <module name="javax.el.api"/> <module name="org.glassfish.el"/> <module name="javax.el.impl"/> </exclusions> <local-last value="true"/> </deployment> </jboss-deployment-structure>
同时将JSF 1.2(如jsf-api-1.2.jar、jsf-impl-1.2.jar)和EL 2.2(如el-api-2.2.jar、el-impl-2.2.jar)的jar包放入WEB-INF/lib目录。
内容的提问来源于stack exchange,提问作者R. prakash
相关产品推荐
相关产品推荐

