你可以使用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中找到它提供的方法的描述。
