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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:15:09