javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL设置为TRUE时必填字段问题

时间:2012-05-21 20:48:15

标签: jsf-2

在MyFaces和Mojarra 2.1中,存在一个缺陷,当javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL设置为true时,任何标记为必需且在模型中预先填充的字段,在消隐时提交的内容将使用原始的非消隐值重新显示,而不是留空。

情景是:

  1. 用户加载页面,其中包含一个必填字段,该字段填充了模型中的现有数据
  2. 用户清除页面上的字段并提交表单
  3. 验证失败,正如预期的那样,并向用户显示一条错误消息,表明他们必须填写     必填项目。
  4. 问题在于,该字段应显示用户提交的内容 - 即他们为字段提交的空白值 - 而是填充模型中的原始值。唯一的解决方法是将javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL设置为false。设置为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,但却没有遇到此必填字段可用性问题?

1 个答案:

答案 0 :(得分:7)

JSF 2 - Bean Validation: validation failed -> empty values are replaced with last valid values from managed bean详细解释了这个问题。到目前为止,在Mojarra中,它是由HtmlBasicRenderer#getCurrentValue()中的错误或至少疏忽造成的,并且已被报告为issue 2262

同时,解决此问题的最简单方法是将第三方组件库与PrimeFaces等自己的渲染器一起考虑,将UIInput的源文件直接复制到项目的源文件夹中,然后编辑相应地getSubmittedValue()

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

它最终会出现在/WEB-INF/classes中,这将在JSF JAR文件中的类加载之上获得优先级。不可否认,它有点笨拙,但它不如重建JSF JAR文件或覆盖每个输入渲染器那么痛苦。