绑定到 Integer 属性的 h:inputText 正在提交值 0 而不是 null

Posted

技术标签:

【中文标题】绑定到 Integer 属性的 h:inputText 正在提交值 0 而不是 null【英文标题】:h:inputText which is bound to Integer property is submitting value 0 instead of null 【发布时间】:2011-03-08 04:30:45 【问题描述】:

我们在绑定到Integer 属性的JSF 页面中使用h:inputText(因此可以接受null)。当h:inputText 中没有写入值时,表单将提交0 而不是null。我们使用的是 Trinidad 1.2.2 和 Tomcat 6.0.20(我们也尝试使用 Tomcat 6.0.14,因为我们了解到某些 Tomcat 版本可能会发生这种情况)。

这是怎么引起的,我该如何解决?

【问题讨论】:

PrimeFaces 特定:与这个问题斗争了大约一天。在我们的项目中,我们有一个覆盖 PrimeFaces 6.0 组件的自定义标签库,以满足我们的需求和风格。我们有一个覆盖 <p:inputNumber/> 的标签,并且我们的组件在空输入值上不断返回 0。事实证明,<p:inputNumber/> 上的 emptyValue 属性导致了这个问题(即使它是空的 - 例如emptyValue="")。删除emptyValue 属性后(停止在<p:inputNumber/> 中声明它)一切正常。 【参考方案1】:

这个“特性”是根据 Tomcat 6.0.16 引入的 EL 中的错误修复的结果。根据EL specification 的第 1.18.3 章,null 的数字类型值应强制为 0。在 Tomcat 6.0.16 之前,这被“错误地”强制为空字符串。

毕竟,空字符串实际上比零更直观。 Apache 的 Tomcat 人员收到了很多关于此错误修复的投诉,因此他们根据 Tomcat 6.0.17 引入了一个新的配置设置,该配置设置类似于 VM 参数,这将禁用此错误修复。

-Dorg.apache.el.parser.COERCE_TO_ZERO=false

顺便说一句,我请求更改此规范,它应该只将空/null primitive 类型强制为零和空/null non-primitive @987654330 @ 类型为空字符串:JSP EL issue 184。他们没有做太多,但这个问题至少得到了很多选票。谁知道...这种行为至少确实很烦人,因为它不直观。

另见:

The empty String madness How to make number input area initially empty instead of 0 or 0.00? How to set -Dorg.apache.el.parser.COERCE_TO_ZERO=false programmatically Work around for faulty INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL in Mojarra JSF 2.1

【讨论】:

除了全局关闭/打开它之外,没有其他方法可以解决这个问题吗?还有上下文参数条目?恭喜 500k btw ;) @das:这是服务器设置,而不是 Web 应用设置。所以上下文参数绝对是不可能的。从 webapp 端最接近的方法是通过System#setProperty() 以编程方式设置 VM 参数,并祈祷在以编程方式设置它之前尚未对其进行咨询(即仅咨询一次)。在ServletContextListener 中这样做就足够了:***.com/questions/5225013/coerce-to-zero-at-runtime/… VM(虚拟机?)参数“-Dorg.apache.el.parser.COERCE_TO_ZERO=false”是否输入到 /tomcathome/conf/system.properties 文件中?我在tomcat.apache.org/tomcat-7.0-doc/config/systemprops.html 找到了设置,但没有看到创建条目的位置。谢谢。 @Ted:取决于你如何启动 Tomcat。例如。 IDE、命令行、服务等。该参数基本上必须传递给java 命令。 @BalusC 谢谢。对于 Eclipse IDE,我在 Server->Tomcat->Open Launch Configuration->Arguments 下找到了它。对于我的生产服务器,我想我会在命令行中添加它。

以上是关于绑定到 Integer 属性的 h:inputText 正在提交值 0 而不是 null的主要内容,如果未能解决你的问题,请参考以下文章

初学SSM遇到的BUG

SpringMVC Databinding(数据绑定)

Django - 如何将属性移动到另一个模型并删除它

JerseyTest:如何绑定到Set

AngularJS:绑定到服务属性的正确方法

绑定到静态属性