清除它们后,JSF可选旧值返回

时间:2012-10-11 11:43:19

标签: jsf-2 primefaces reset optional omnifaces

我正在使用JSF,PrimeFaces 3.2,Omnifaces 1.1,JBoss AS 7.1.1,Final,Mojarra 2.1.7

我的表单有两个不需要的数字字段,如下所示:

<h:form>
    <p:inputText id="num1" value="#{bean.field1}"/>
    <p:inputText id="num2" value="#{bean.field2}"/>
<p:commandButton ... ajax="true" />
</h:form>

我还在faces-config上设置了OmniFaces ResetInputAjaxActionListener。

bean属性field1和field2是Integer。

现在的问题是,如果我在num1上输入123并在num2上输入345并单击OK一切正常。 如果我然后从num1中删除123并将abc放在num2上。然后显示验证(转换)错误,但123返回!

如果我把它们都要求= true那么一切都很好。

有没有办法让这项工作与可选字段一起使用?

1 个答案:

答案 0 :(得分:1)

这是Mojarra的具体问题。 Integer隐式转换绑定到IntegerConverter的字段,该字段将提交的空字符串值转换为null,并在组件的本地中将其设置为UIInput#getValue()值。

在提交后重新显示表单时,JSF将首先检查提交的值是否为null然后显示它,否则如果本地值不为null,则显示它,否则显示模型值。由于本地值为null,因此显示的是模型值。这确实是不受欢迎的行为,并且已多次报道:

可以通过覆盖public Object getValue() { return isLocalValueSet() ? getLocalValue() : super.getValue(); } 来解决此问题,如下所示:

javax.faces.component.UIInput

MyFaces已经做对了。我再次re-reported这个问题最终以spec issue 566结尾(更新,最后在Mojarra 2.2.0中修复并向后移植到2.1.21)。

同时,解决此问题的最简单方法是,将第三方组件库与PrimeFaces等自己的渲染器一起考虑,就是在项目中直接复制UIInput#getValue()类的源代码文件&#39; s源文件夹,然后添加所需的ResetInputAjaxActionListener方法。是的,这是一个笨拙的解决方案,但由于问题的原因在JSF API本身很深,所以并不是一个更好的方法。

OmniFaces {{1}}有着完全不同的用途,并没有设计/适合解决这个问题。它应该清除输入组件的状态,组件的值提交,但组件本身在ajax中重新呈现。