6

在 MyFaces 和 Mojarra 2.1 中,都存在一个缺陷,即 whenjavax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL设置为true时,在模型中标记为必填和预填充的任何字段,在空白和提交时都会重新显示其原始未空白值而不是留空。

场景是:

  1. 用户加载带有单个必填字段的页面,该字段填充了模型中的现有数据
  2. 用户清除页面上的字段并提交表单
  3. 验证按预期失败,并且向用户显示一条错误消息,提示他们必须填写必填字段。

问题是该字段应该显示用户提交的内容(即他们为该字段提交了一个空白值),而是使用模型中的原始值填充。唯一的解决方法是设置javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULLfalse. 设置为false提供所需的行为,即当重新显示页面并显示必填字段错误消息时,该字段保持空白。

使用 Mojarra (http://java.net/jira/browse/JAVASERVERFACES-2375) 和 MyFaces (https://issues.apache.org/jira/browse/MYFACES-3525) 记录了一个缺陷,但没有取得任何进展在 6 周内。

请注意,Mojarra 似乎在 6 个月前报告了类似的问题,但尚未取得任何进展。

有谁知道一个解决方法,我们可以保持javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL设置为 true 而不是 false,但不会遇到这个必填字段可用性问题?

4

1 回答 1

8

这个问题在JSF 2 - Bean Validation 中有详细解释:验证失败 -> 空值被替换为托管 bean 的最后一个有效值。到目前为止,在 Mojarra 中,它是由错误或至少是疏忽引起的,HtmlBasicRenderer#getCurrentValue()并且已报告为issue 2266

同时,解决此问题的最简单方法,同时考虑到具有自己的渲染器(如 PrimeFaces)的 3rd 方组件库,是将源文件UIInput直接复制到项目的源文件夹中,然后进行getSubmittedValue()相应的编辑:

public Object getSubmittedValue() {
    if (submittedValue == null && !isValid() && considerEmptyStringNull(FacesContext.getCurrentInstance())) {
        return "";
    }
    else {
        return submittedValue;
    }
}

它将最终进入/WEB-INF/classes,这将在类加载中优先于 JSF JAR 文件中的类加载。诚然,这有点笨拙,但它比重建 JSF JAR 文件或覆盖每个输入渲染器要少痛苦。

于 2012-05-21T21:29:29.907 回答