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