jakarta.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL未转空串为null求助
空字符串转Null失效问题:表单提交空串注入后台Bean仍为空而非预期Null
问题描述
表单提交的空字符串注入后台Bean时始终是空串,无法转为预期的Null,该问题尚未解决。
依赖配置(pom.xml)
<dependency> <groupId>jakarta.platform</groupId> <artifactId>jakarta.jakartaee-api</artifactId> <version>9.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.primefaces</groupId> <artifactId>primefaces</artifactId> <version>12.0.0</version> <classifier>jakarta</classifier> </dependency> <dependency> <groupId>org.primefaces.extensions</groupId> <artifactId>primefaces-extensions</artifactId> <version>13.0.0-RC2</version> <classifier>jakarta</classifier> </dependency> <dependency> <groupId>org.omnifaces</groupId> <artifactId>omnifaces</artifactId> <version>4.2</version> </dependency>
已配置的上下文参数(web.xml)
已添加JSF官方上下文参数,本应将提交的空字符串转为Null:
<context-param> <param-name>jakarta.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name> <param-value>true</param-value> </context-param>
运行环境
使用TomEE Plus 9.1.0内置的Tomcat v10.0.27,服务器自动提供Apache MyFaces作为JSF实现,启动日志如下:
INFO: Server version name: Apache Tomcat (TomEE)/10.0.27 (9.1.0) INFO: Registering OpenAPI servlet on /openapi for application Jul 20, 2023 3:41:47 PM org.apache.myfaces.ee.MyFacesContainerInitializer onStartup INFO: Using OmniFaces version 4.2 INFO: MyFaces Core Servlet 4.0 support enabled
已尝试的方案
- 切换Dynamic Web Module版本为5.0和4.0,问题依旧
- 参考空字符串转Null的相关解决方案,确认其中的
EmptyToNullStringELResolver适配JSF 4.0,已将导入包从javax.*改为jakarta.*:
import jakarta.el.ELContext; import jakarta.el.ELResolver;
推测可能存在JSF配置遗漏,寻求解决方案。
解决方案建议
1. 补充MyFaces特定配置
Apache MyFaces除了JSF标准参数外,还有自身的空串转Null配置,需在web.xml中添加:
<context-param> <param-name>org.apache.myfaces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name> <param-value>true</param-value> </context-param>
部分MyFaces版本对标准参数的支持存在优先级问题,补充该参数可确保规则生效。
2. 确认OmniFaces Resolver配置
OmniFaces的EmptyToNullELResolver会覆盖默认行为,需在faces-config.xml中正确注册该Resolver:
<application> <el-resolver>org.omnifaces.el.EmptyToNullELResolver</el-resolver> </application>
注:OmniFaces 4.x版本已内置该Resolver,若已添加依赖,需确认无配置覆盖情况。
3. 检查PrimeFaces组件属性
部分PrimeFaces组件(如InputText)的trim属性需配合转Null规则使用,确保配置:
<p:inputText value="#{bean.field}" trim="true" />
开启trim="true"会先去除输入空格,再将空串转为Null。
4. 验证Bean属性类型
确保后台Bean的目标属性为String类型,避免使用Optional<String>等可能绕过转Null规则的类型。
内容的提问来源于stack exchange,提问作者Ted Spradley
相关产品推荐
相关产品推荐

