©
本文档使用 PHP中文网手册 发布
你可以使用Spring提供的validator接口进行对象的校验。Validator
接口与Errors
协同工作,在Spring做校验的时候,它会将所有的校验错误汇总到Errors
对象中去。
来看这个简单的数据对象:
public class Person {
private String name;
private int age;
// the usual getters and setters...
}
实现org.springframework.validation.Validator
接口中的两个方法,我们将为对Person
类加上校验行为:
supports(Class)
:表示这个Validator
是否支持该Class
的实例?
validate(Object, org.springframework.validation.Errors)
:对提供的对象进行校验,并将校验的错误注册到传入的Errors
对象中。
实现一个Validator
也比较简单,尤其是当你学会了Spring所提供的ValidationUtils
以后。我们一起来看一下如何才能创建一个校验器。
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; } 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中找到它提供的方法的描述。