JSF:在UI中绑定到inputtext的整数属性在提交时被设置为零。

9

我有一个bean,其中的整数属性绑定到jsp页面上的inputtext UI元素。

最初渲染时,这些整数属性的默认值为null。

现在,当我提交表单而不更改此inputtext字段时,尽管ui文本字段为空,但此字段将设置为整数值零。

由于我想跟踪字段的更改并仅更新那些在配置文件中已更改的字段,但是这给我带来了问题,因为它会导致所有整数字段都被更新。

我正在使用jsf 1.2

5个回答

18

然而,这个问题只针对Tomcat的EL实现(例如,Glassfish就没有这种愚蠢的行为)。在Tomcat 6.0.16之前,它可以按照直觉地正常工作。但是,随后发现它实际上违反了EL规范,并进行了修复。在经过大量批评后,从6.0.17版本开始,他们将其设置为可配置项。您可以通过添加以下VM参数来关闭它:

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

我认为这比侵入getter/setter更好。你不想那样污染你的模型。

相关问题:


3
我也不想污染我的模型。但是我曾经使用过COERCE_TO_ZERO,然后集成人员在部署到下一个分阶段环境时忘记设置它,导致比在代码中进行修复浪费更多的努力。请问需要翻译的内容是否正确? - meriton
这个配置只适用于Tomcat吗?我在使用Websphere时也遇到了这个问题。 - Fritz
对于那些不想在环境中更改这个的人,你可以使用这个来解决它。 - Addison

9
JSF EL规范规定,在分配数字类型属性之前,必须将null转换为0。 (请参阅强制规则章节)。关于此问题已经提交了问题,但规范人员正在忽略它。
没有真正漂亮的解决方案。最简单的方法是在setter中将0转换回null,但这假设0永远不是有效输入。其他选择包括使setter和getter接收/返回非数字类型(例如String),并在setter/getter中执行对Integer的转换。但是,这意味着您会在JSF生命周期的较晚阶段检测到非数字输入,因此还需要额外的验证器/转换器来处理它。
编辑:Websphere 7.0.0.11不会将null强制转换为0

2

请参考BalusC的完整回答

他说你可以将系统属性org.apache.el.parser.COERCE_TO_ZERO设置为false,但你也可以编写一个ServletContextListener,在Web应用程序启动时设置它。


1
对于Websphere用户,定义一个用户定义的JVM系统属性,它就可以工作了!

你能具体说明一下吗?在WebSphere中,你使用了哪个具体的JVM系统属性来解决这个问题? - Fritz

0

在IBM支持网站上找到了链接,供Websphere用户使用。

基本上有以下步骤:

您可以使用管理控制台设置org.apache.el.parser.COERCE_TO_ZERO属性,方法如下:

  1. 展开Servers,选择WebSphere应用服务器,然后从列表中单击适当的服务器。

  2. 在服务器基础结构下,展开Java和进程管理>单击进程定义。

  3. 在其他属性下,单击Java虚拟机。

  4. 在其他属性下,单击自定义属性。

  5. 单击新建并添加org.apache.el.parser.COERCE_TO_ZERO属性,如果您不想将null值强制转换为零,则该属性的值为false。

  6. 单击保存以保存更改并重新启动WebSphere应用程序服务器,以确保更改生效。默认值:true


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接