2011-05-24 32 views
7

Tôi đang sử dụng JSF2 trên GlassFish 3.Không nên bỏ qua xác thực khi không có giá trị nào được chỉ định?

Tôi có biểu mẫu chấp nhận và số điện thoại tùy chọn. Tôi có trình xác thực số điện thoại tùy chỉnh này (bên dưới) và tôi có trường được đặt thành required = "false" vì số điện thoại là tùy chọn trong biểu mẫu.

Vấn đề là, giá trị trong trường luôn được xác thực. Không nên bỏ qua xác thực khi không có giá trị nào được chỉ định?

Có điều gì đó tôi đang làm sai. Bất kỳ trợ giúp được đánh giá cao, cảm ơn!

<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); 
     } 
    } 

} 

Trả lời

21

Từ JSF 2.0 trên, JSF sẽ theo mặc định xác nhận các lĩnh vực có sản phẩm nào cũng để chơi tốt với mới Java EE 6 cung cấp JSR 303 Bean Validation API trong đó cung cấp số những người khác @NotNull và bật.

Về cơ bản có hai cách để đi xung quanh này:

  1. biết chính xác JSF để không xác nhận các lĩnh vực có sản phẩm nào bởi các mục sau đây trong web.xml.

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

    Điều bất lợi là hiển nhiên: bạn không thể sử dụng Xác thực đậu JSR 303 với toàn bộ quyền hạn của nó nữa.


  2. Tự mình kiểm tra trong Validator.

    if (object == null) return; 
    

    Nếu bạn không có một param javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL bối cảnh được thiết lập để true, sau đó bạn muốn đúc để String và kiểm tra isEmpty() là tốt.

Các vấn đề liên quan