【问题标题】:JSF optional old values come back after clearing themJSF 可选旧值在清除它们后返回
【发布时间】:2012-10-02 01:39:42
【问题描述】:

我正在使用 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 那么一切都很好。

有没有一种方法可以使用可选字段?

【问题讨论】:

    标签: jsf-2 primefaces reset optional omnifaces


    【解决方案1】:

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

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

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

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

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

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

    OmniFaces ResetInputAjaxActionListener 的用途完全不同,并非设计/不适合解决此问题。应该清除组件值提交的输入组件的状态,但是组件本身在ajax中重新渲染。

    【讨论】:

    • 我忘了提到 javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL 参数设置为 false
    • 对,这是由隐含的IntegerConverter 引起的,它将"" 转换为null(假设这些字段绑定到Integer
    • 是的,它们绑定到整数。那么字符串不应该发生这种情况?
    • 除非有其他原因,否则字符串也会发生这种情况
    • 我能够通过为 java.lang.String 编写一个将空值设置为空字符串的自定义转换器来规避字符串的这个问题。但对于整数(和日期)来说,这是一项更困难的任务。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多