WebSphere(MyFaces+Apache EL)下JSF输入提交空串而非null的问题排查
问题背景
JSF表单的原生<h:inputText>组件提交空输入时,后台Bean的setter接收到的是空字符串""而非null,但相同应用在Wildfly上运行正常。已配置以下参数但无效:
INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL在web.xml中设为true- JVM参数
org.apache.el.parser.COERCE_TO_ZERO设为false - 运行时使用Apache MyFaces EL解析器
- 无自定义转换器/阶段监听器干扰
调试显示:ValueExpressionImpl.setValue(elContext, null)传入的是null(符合预期),但后续FacesCompositeELResolver.setValue(...)收到的是""(异常),说明EL解析过程中null被转换为""。
可能的原因及排查方向
1. WebSphere内置EL解析器的优先级干扰
WebSphere自带了EL实现,即便配置了MyFaces的EL解析器,其默认的PARENT_FIRST类加载策略可能导致WebSphere的ELResolver优先被加载,混入FacesCompositeELResolver中。这类内置解析器可能存在独立的空值转换逻辑,忽略INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL配置。
- 排查:将应用类加载策略改为PARENT_LAST,确保MyFaces的EL相关jar包优先加载;调试查看
FacesCompositeELResolver中的Resolver列表,确认是否存在WebSphere相关实现类。
2. WebSphere容器级配置覆盖
WebSphere对JSF有专属扩展配置,可能在服务器级别或应用的ibm-web-ext.xml中设置了参数,覆盖web.xml的配置:
- 检查
ibm-web-ext.xml中是否存在com.ibm.ws.jsf.INTERPRET_EMPTY_STRING_AS_NULL参数,若设为false会覆盖全局配置; - 查看WebSphere控制台的JSF容器设置,确认是否有相关空值转换的自定义参数。
3. MyFaces与WebSphere的版本兼容性问题
WebSphere 9.0.5.18绑定的MyFaces版本可能存在特定环境下的bug,导致INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL逻辑失效:
- 查看MyFaces官方文档或版本说明,确认对应版本在WebSphere环境下是否有已知的空值转换问题;
- 尝试升级MyFaces到与WebSphere 9兼容的最新稳定版本,验证问题是否解决。
4. WebSphere扩展模块的拦截修改
WebSphere的某些内置模块(如安全模块、请求处理扩展)可能在EL值传递过程中进行拦截,将null转换为"":
- 调试追踪
FacesCompositeELResolver中每个Resolver的setValue调用,定位触发转换的具体Resolver; - 临时禁用WebSphere的非必要扩展模块(如安全验证、自定义请求过滤器),验证是否影响空值转换逻辑。
5. Servlet容器的参数预处理差异
WebSphere的Servlet容器在请求参数解析阶段,可能已将空请求参数转换为"",后续JSF的INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL逻辑无法生效:
- 对比Wildfly与WebSphere的请求参数解析逻辑,检查WebSphere是否对空参数有默认转换规则;
- 调试查看请求到达JSF应用时的参数值,确认是否在进入JSF生命周期前已被转换为
""。
内容的提问来源于stack exchange,提问作者EPMS Devteam

