JSF2中的Validator问题

时间:2013-12-23 09:46:46

标签: jsf-2 validation jsf-1.2

我们正在从JSF 1.2迁移到JSF2。 我们在验证方面面临问题。我们正在使用apache myfaces 2和rich faces 4.3 下面是xhtml代码:

<h:form id="form">      
            <ui:include src="panel1.xhtml"/>

                <h:commandButton id="btn1" value="Submit" action="#{bean.submit}"/>

</h:form>

panel1.xhtml包含一个自定义组件,如下所示:

  <h:panelGrid columns="2">

               <h:outputText value="Enter Phone"/>                                 
               <h:inputText id="compId" value="#{map['Phone']}" size="12" maxlength="20"  required="true" 
               validator="#{validator.validatePhone}"/>

           <!-- other components omitted  -->
 </h:panelGrid>

 public void validatePhone(FacesContext arg0, UIComponent arg1, Object obj)
            throws ValidatorException {

        String phoneVal = (String) obj;

        if(phoneVal .length() <5){
            //rest of the code is omitted 
        }

}

问题是,当未输入电话价值(保持为空)并提交表格时,以下是观察结果。

JSF 2: 使用Object obj值(在validatePhone方法中)调用validator.validatePhone为null

JSF 1.2: required =“true”属性首先生效,并且根本不调用validator.validatePhone(如果Phone字段中没有值)并且验证 显示错误。

问题是:

1)为什么为JSF 2调用validator.validatePhone,即使Phone字段中没有值? 2)为什么在上述情况下JSF 1.2和JSF 2中的行为发生了变化?

1 个答案:

答案 0 :(得分:1)

不一致的原因是在JSF2中,null值默认情况下不会失败验证。来自the Javadocs

  

要使验证器完全符合规范的版本2及更高版本,它必须不会对null值或空值进行验证失败,除非它专门用于解决空值或空值

要支持JSF1.2的验证行为,请使用javax.faces.VALIDATE_EMPTY_FIELDS上下文参数:

<context-param>
    <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
    <param-value>false</param-value>
</context-param>