使用Spring的Validator接口進行校驗


你可以使用Spring提供的validator接口進行對象的校驗。Validator接口與Errors協同工作,在Spring做校驗的時候,它會將所有的校驗錯誤匯總到Errors對象中去。

來看這個簡單的數據對象:

package container.test;

public class Person {

    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}

實現org.springframework.validation.Validator接口中的兩個方法,我們將為對Person類加上校驗行為:

  • supports(Class):表示這個Validator是否支持該Class的實例?

  • validate(Object, org.springframework.validation.Errors):對提供的對象進行校驗,並將校驗的錯誤注冊到傳入的Errors 對象中。

 

實現一個Validator也比較簡單,尤其是當你學會了Spring所提供的ValidationUtils以后。我們一起來看一下如何才能創建一個校驗器。 

package container.test;

import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
/**
 * Spring框架的數據校驗
 * @author Administrator
 *
 */
public class PersonValidator implements Validator {

    public boolean supports(Class clazz) {
        return Person.class.equals(clazz);
    }

    public void validate(Object obj, Errors e) {
        ValidationUtils.rejectIfEmpty(e,"name","name.empty");
        Person p=(Person)obj;
        if(p.getAge()<0){
            e.rejectValue("age", "negativevalue");
        }else if(p.getAge()>110){
            e.rejectValue("age", "too.darn.old");
        }
    }
}

如你所見,我們使用了ValidationUtils中的一個靜態方法rejectIfEmpty(..)來對name屬性進行校驗,假若'name'屬性是 null 或者空字符串的話,就拒絕驗證通過 。請參照ValidationUtils相關的JavaDoc,查看一下除了例子中介紹過的之外其他的一些功能。

對復雜對象來說,實現Validator類來驗證其內置的屬性類當然也是可行的,但是為每個內置類的示例實現Validator可能是個更好的主意。關於這樣的一個'rich'這樣的例子是Customer類,它包含兩個String屬性(first name 和second name),還有一個復雜的Address對象。Address對象可能獨立於Customer對象,因此獨立實現了一個AddressValidator。假若你希望你的CustomerValidator重用AddressValidator內部的邏輯,但是又不想通過拷貝粘貼來實現,你可以在你的CustomerValidator中依賴注入AddressValidator對象,或者創建一個。然后這樣用:

public class CustomerValidator implements Validator {

   private final Validator addressValidator;

   public CustomerValidator(Validator addressValidator) {
      if (addressValidator == null) {
          throw new IllegalArgumentException("The supplied [Validator] is required and must not be null.");
      }
      if (!addressValidator.supports(Address.class)) {
          throw new IllegalArgumentException(
            "The supplied [Validator] must support the validation of [Address] instances.");
      }
      this.addressValidator = addressValidator;
   }

    /**
    * This Validator validates Customer instances, and any subclasses of Customer too
    */
   public boolean supports(Class clazz) {
      return Customer.class.isAssignableFrom(clazz);
   }

   public void validate(Object target, Errors errors) {
      ValidationUtils.rejectIfEmptyOrWhitespace(errors, "firstName", "field.required");
      ValidationUtils.rejectIfEmptyOrWhitespace(errors, "surname", "field.required");
      Customer customer = (Customer) target;
      try {
          errors.pushNestedPath("address");
          ValidationUtils.invokeValidator(this.addressValidator, customer.getAddress(), errors);
      } finally {
          errors.popNestedPath();
      }
   }
}

驗證錯誤會被報告到傳來的Errors對象中。在Spring Web MVC中,你可以使用<spring:bind/>標簽來檢查錯誤信息,當然你也可以自行處理錯誤。可以在它的Javadoc中找到它提供的方法的描述。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM