Jsf 2 为什么JSF必需的验证错误会将输入字段替换为其原始值

Jsf 2 为什么JSF必需的验证错误会将输入字段替换为其原始值,jsf-2,Jsf 2,使用JSF 2.0: 用户加载带有输入字段的页面,该字段绑定到具有现有值的支持bean字段。输入字段已按要求标记。如果用户随后清空字段并提交表单,则会显示所需的消息,如预期的那样,但是在呈现页面时,字段的值将替换为其原始值,而不是将字段留空 此行为与字段上存在格式验证错误时发生的情况不一致(与必需的验证错误相比)例如,如果有一个字段供用户在链接到电子邮件格式验证器的页面上输入电子邮件地址,并且当页面加载无效电子邮件地址并提交表单时,用户替换了该字段中填充的现有有效电子邮件地址,此时将显示验证错误

使用JSF 2.0:

用户加载带有输入字段的页面,该字段绑定到具有现有值的支持bean字段。输入字段已按要求标记。如果用户随后清空字段并提交表单,则会显示所需的消息,如预期的那样,但是在呈现页面时,字段的值将替换为其原始值,而不是将字段留空

此行为与字段上存在格式验证错误时发生的情况不一致(与必需的验证错误相比)例如,如果有一个字段供用户在链接到电子邮件格式验证器的页面上输入电子邮件地址,并且当页面加载无效电子邮件地址并提交表单时,用户替换了该字段中填充的现有有效电子邮件地址,此时将显示验证错误消息,并且电子邮件地址字段的当前值将保持不变(并且在加载页面时不会替换为其原始值)

当出现所需字段验证错误时,与重新加载其原始(非空)值相比,是否有任何方法将字段保留为空

更多详情:

  • Weblogic 10.3.2
  • MyFaces 2.0.12
JSF页面:

<h:form>
  <h:messages showSummary="true"/>
  <h:inputText value="#{page1Controller.firstName}" 
               required="true" 
               requiredMessage="You must enter a first name"/>
  <h:commandButton value="Submit"/>
</h:form>

你的支持bean的范围是什么


该问题可能与作用域有关,因为在验证错误后可能会重新加载Bean,导致输入字段显示原始Bean的值

更改上下文参数javax.faces.exploration_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL in web.xml从true改为false修复了该问题

我也有同样的问题 (含Mojarra 2.2.7的玻璃鱼)

如果用户编辑了一个已经填充了数据的页面,那么在一个SelectOne菜单中,他选择了empty选项,当他提交时,他得到了验证错误(字段为空),值返回

为了解决这个问题,我添加了以下内容:

<h:selectOneMenu value="#{myBean.value}" validator="#{myBean.required}">
 <f:selectItem itemValue="#{null}" itemLabel="" />
 <f:selectItems value="#{myBean.list}" />
</h:selectOneMenu>

 public void required(FacesContext context, UIComponent component, Object value) throws ValidatorException {
    if(value == null) {
        ((UIInput) component).setValue(null);
        ((UIInput) component).setValid(false);
        throw new ValidatorException(new FacesMessage("Empty!"));
    }
}

需要公共void(FacesContext上下文、UIComponent组件、对象值)引发异常{
如果(值==null){
((UIInput)组件).setValue(null);
((UIInput)组件).setValid(false);
抛出新的ValidatorException(newfacesMessage(“Empty!”);
}
}
但是如果我们可以使用“required=true”就更好了。 我们没有任何设置来解释\u空\u字符串\u提交的\u值\u为\u空,所以我不认为这是原因

[编辑]
实际上,我注意到只有h:datatable中的输入才是这种情况,这不是默认行为。它应该已经按照您最初的预期工作了。更重要的是,我刚刚在Tomcat7.0.26上用Mojarra 2.1.7尝试了一个快速的“n”肮脏的例子,它对我很有效。请出示SSCCE,并提及确切的JSF impl/version和appserver impl/version。这确实没有任何区别。(尚不清楚这是否是一个潜在的缺陷;人们可能会预期是否设置了true或false,所需字段关于重置其原始值的行为应该是一致的,或者至少差异应该记录在规范中)注意,为此记录了一个JSF Jira缺陷-
<h:selectOneMenu value="#{myBean.value}" validator="#{myBean.required}">
 <f:selectItem itemValue="#{null}" itemLabel="" />
 <f:selectItems value="#{myBean.list}" />
</h:selectOneMenu>

 public void required(FacesContext context, UIComponent component, Object value) throws ValidatorException {
    if(value == null) {
        ((UIInput) component).setValue(null);
        ((UIInput) component).setValid(false);
        throw new ValidatorException(new FacesMessage("Empty!"));
    }
}