我正在使用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那么一切都很好。
有没有办法让这项工作与可选字段一起使用?
答案 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中重新呈现。