在MyFaces和Mojarra 2.1中,存在一个缺陷,当javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL
设置为true
时,任何标记为必需且在模型中预先填充的字段,在消隐时提交的内容将使用原始的非消隐值重新显示,而不是留空。
情景是:
问题在于,该字段应显示用户提交的内容 - 即他们为字段提交的空白值 - 而是填充模型中的原始值。唯一的解决方法是将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,但却没有遇到此必填字段可用性问题?
答案 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文件或覆盖每个输入渲染器那么痛苦。