1

我正在使用 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 是整数。

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

如果我让它们都 required=true 那么一切都很好。

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

4

1 回答 1

1

这是 Mojarra 的特定问题。绑定到 an 的字段被Integer隐式转换,IntegerConverter后者将提交的空字符串值转换为并将其null设置为组件的本地值。

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

这可以通过覆盖来解决,UIInput#getValue()如下所示:

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

MyFaces已经做到了。我再次重新报告了这个问题,最终成为规范问题 566更新并最终在 Mojarra 2.2.0 中修复并向后移植到2.1.21)。

同时,解决此问题的最简单方法,同时考虑到具有自己的渲染器(如 PrimeFaces)的 3rd 方组件库,是将javax.faces.component.UIInput类的源代码文件直接复制到项目的源文件夹中,然后添加所需的UIInput#getValue()方法。是的,一个笨拙的修复,但是没有更好的方法,因为问题的原因在 JSF API 本身很深。

OmniFacesResetInputAjaxActionListener用于完全不同的目的,并且不适合/不适合解决此问题。应该清除未提交组件值的输入组件的状态,但组件本身在ajax中重新渲染。

于 2012-10-11T13:16:24.000 回答