即使字符串到数字的转换失败,FacesContext isValidationFailed 也会返回 false

FacesContext isValidationFailed is returning false even when string to numeric conversion is failed

我的表格有很多值,每个值都有自己的验证。为简单起见,我在这里只使用整数和字符串。

<form jsf:id="aaaa" >
     <input type="text"
               jsf:id="number-field" 
               jsf:value="#{managedBean.bean.value1}"
               jsf:converterMessage="Error Integer"                           
      </input>
      <input type="text"
               jsf:id="text-field" 
               jsf:value="#{managedBean.bean.value2}"
               jsf:converterMessage="Error Text"                           
      </input>
      <button jsf:id="reset-data-button" 
                jsf:action="#{managedBean.save}" jsf:immediate="true">
                submit
                <f:ajax execute="@form" render="@form/>
      </button>
</form>

value1 是整数,value2 是字符串。

在我的 bean 中,我手动验证字段并存储到数据库中。我不想多次显示错误消息,所以我添加了 immediate true。

在我的豆子里

public void save() {                
    if (value1.valid() && value2.valid() && facesContext.isValidationFailed()) {
        //do some action
    }
}

虽然 I have entered string value in value1 which is integer field 我得到 facesContext.isValidationFailed() as false 但应该是真的。

我这里是不是做错了。

我正在使用 mojarra 2.2.8

命令按钮上的立即属性意味着 action="#{managedBean.save}"APPLY_REQUEST 值阶段之后立即执行。这造成的问题是 value1value2 那时还没有设置到表单条目,因此任何依赖于该条件的逻辑都会失败。

您在这里应该做的是将这些输入组件标记为 immediate="true" 并向组件添加适当的验证器。这种组合将确保组件在执行 save 方法的同一步骤中得到验证。但是,您仍然无法访问经过验证的输入值;直到请求处理的 UPDATE_MODEL_VALUES 阶段才会发生,在 save 方法执行很久之后