?
This document uses PHP Chinese website manual Release
你可以使用Spring提供的validator接口進(jìn)行對象的校驗(yàn)。Validator
接口與Errors
協(xié)同工作,在Spring做校驗(yàn)的時候,它會將所有的校驗(yàn)錯誤匯總到Errors
對象中去。
來看這個簡單的數(shù)據(jù)對象:
public class Person {
private String name;
private int age;
// the usual getters and setters...
}
實(shí)現(xiàn)org.springframework.validation.Validator
接口中的兩個方法,我們將為對Person
類加上校驗(yàn)行為:
supports(Class)
:表示這個Validator
是否支持該Class
的實(shí)例?
validate(Object, org.springframework.validation.Errors)
:對提供的對象進(jìn)行校驗(yàn),并將校驗(yàn)的錯誤注冊到傳入的Errors
對象中。
實(shí)現(xiàn)一個Validator
也比較簡單,尤其是當(dāng)你學(xué)會了Spring所提供的ValidationUtils
以后。我們一起來看一下如何才能創(chuàng)建一個校驗(yàn)器。
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
中的一個靜態(tài)
方法rejectIfEmpty(..)
來對name屬性進(jìn)行校驗(yàn),假若'name'
屬性是 null
或者空字符串的話,就拒絕驗(yàn)證通過 。請參照ValidationUtils
相關(guān)的JavaDoc,查看一下除了例子中介紹過的之外其他的一些功能。
對復(fù)雜對象來說,實(shí)現(xiàn)Validator
類來驗(yàn)證其內(nèi)置的屬性類當(dāng)然也是可行的,但是為每個內(nèi)置類的示例實(shí)現(xiàn)Validator
可能是個更好的主意。關(guān)于這樣的一個'rich'這樣的例子是Customer
類,它包含兩個String
屬性(first name 和second name),還有一個復(fù)雜的Address
對象。Address
對象可能獨(dú)立于Customer
對象,因此獨(dú)立實(shí)現(xiàn)了一個AddressValidator
。假若你希望你的CustomerValidator
重用AddressValidator
內(nèi)部的邏輯,但是又不想通過拷貝粘貼來實(shí)現(xiàn),你可以在你的CustomerValidator
中依賴注入AddressValidator
對象,或者創(chuàng)建一個。然后這樣用:
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; } 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(); } } }
驗(yàn)證錯誤會被報(bào)告到傳來的Errors
對象中。在Spring Web MVC中,你可以使用<spring:bind/>
標(biāo)簽來檢查錯誤信息,當(dāng)然你也可以自行處理錯誤??梢栽谒腏avadoc中找到它提供的方法的描述。