2011-05-24 21 views
7

私はGlassFish 3でJSF2を使用しています。値が指定されていない場合、検証をスキップしないでください。

私は受け取る電話番号とオプションの電話番号を持っています。私はこのカスタム電話番号バリデーター(下記)を持っています。電話番号はこのフォームではオプションであるため、フィールドをrequired = "false"に設定しています。

問題は、フィールドの値が常に検証されることです。値が指定されていない場合、検証をスキップしないでください。

私は何か間違っている必要があります。どんな助けでも感謝しています! JSF 2.0から

<h:outputText value="#{msg.profile_otherPhone1Label}#{msg.colon}" /> 
    <h:panelGroup> 
    <p:inputText label="#{msg.profile_otherPhone1Label}" id="otherPhone1" value="#{profileHandler.profileBean.otherPhone1}" required="false"> 
     <f:validator validatorId="phoneValidator" /> 
    </p:inputText> 
    <p:spacer width="12"/> 
    <h:outputText value="#{msg.profile_phoneExample}" /> 
</h:panelGroup> 

public class PhoneValidator implements Validator { 

    @Override 
    public void validate(FacesContext facesContext, UIComponent uIComponent, 
      Object object) throws ValidatorException { 

     String phone = (String) object; 

     // count the digits; must have at least 9 digits to be a valid phone number 
     // note: we're not enforcing the format because there can be a lot of variation 
     int iDigitCount = 0; 
     for (char c : phone.toCharArray()) { 
      if (Character.isDigit(c)) { 
       iDigitCount++; 
      } 
     } 

     if (iDigitCount < 9) { 
      FacesMessage message = new FacesMessage(); 
      message.setSummary(Messages.getMessage("error_phoneNumberNotValid")); 
      message.setSeverity(FacesMessage.SEVERITY_ERROR); 
      throw new ValidatorException(message); 
     } 
    } 

} 

答えて

21

JSFは、デフォルトでは、同様の空のフィールドを検証します、上の新しいJava EE 6とよく遊ぶために他の人の間で提供していますJSR 303ビーン検証APIを提供@NotNull以降。

  1. テルのJSF web.xmlに次のエントリでは空のフィールドを検証しないために:

    は基本的にこの問題を回避行くには2つの方法があります。

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

    不利な点は明らかです。JSR 303 Bean Validationを最大限に活用することはできません。


  2. Validatorにnullcheckを自分で行います。

    if (object == null) return; 
    

    あなたはtrueに設定されているjavax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULLコンテキストのparamを持っていない場合は、Stringにキャストし、同様にisEmpty()チェックしたいと思います。

関連する問題