2012-10-11 20 views
1

我使用JSF后,PrimeFaces 3.2,Omnifaces 1.1,JBoss AS中7.1.1,最后,钻嘴鱼科2.1.7JSF可选旧值回来清除它们

我有两个数字字段都是一种形式不是必须的,就像这样:

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

我还设置OmniFaces ResetInputAjaxActionListener于脸部,配置。

bean属性field1和field2是Integer。

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

如果我让他们都必需=真,那么一切都很好。

有没有办法使这项工作与可选字段?

回答

1

这是一个莫哈拉特定问题。绑定到Integer的字段被IntegerConverter隐式转换,该字段将提交的空字符串值转换为null,并将其设置为组件的本地值。

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

这个问题可以通过覆盖UIInput#getValue()如下:

public Object getValue() { 
    return isLocalValueSet() ? getLocalValue() : super.getValue(); 
} 

MyFaces已经做它对。我已经re-reported这个问题再次最终结束为spec issue 566更新,并最终修复在莫哈拉2.2.0和backported 2.1.21)。

与此同时,解决这个问题的最简单方法是将第三方组件库与PrimeFaces等自己的渲染器考虑在一起,将源代码文件javax.faces.component.UIInput直接复制到项目的源文件夹中,然后添加所需的UIInput#getValue()方法。是的,这是一个笨拙的解决方案,但并没有真正的更好方法,因为问题的原因在于JSF API本身。

OmniFaces ResetInputAjaxActionListener服务于完全不同的目的,并没有设计/适合解决这个问题。它应该清除输入组件的状态,其中组件的值是而非已提交,但组件本身是在ajax中重新呈现的。

+0

我忘了提及\t javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL参数设置为false – bac

+0

哇,我不会期待这种行为。让我看看... – BalusC

+0

正确的,它是由隐含的'IntegerConverter'引起的,它将''''''转换为'null'(假设这些字段绑定到'Integer') – BalusC