一) Validator接口
Spring的Validation功能设计很简单。使用Validator功能即可:
Spring的Validate策略就是一个类(Person)对应一个校验类(PersonValidator)。至于校验类的绑定,可以代码中显式的调用,也可以是采用annotation。个人比较推荐用annotation的方法。而如果在一个类的校验中需要用到另一个类的校验,我们可以这样写:
Spring的Validation功能设计很简单。使用Validator功能即可:
- public class Person {
- private String name;
- private int age;
- // the usual getters and setters...
- }
- public class PersonValidator implements Validator {
- /**
- * This Validator validates just Person instances
- */
- 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");
- }
- }
- }
public class Person {
private String name;
private int age;
// the usual getters and setters...
}
public class PersonValidator implements Validator {
/**
* This Validator validates just Person instances
*/
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");
}
}
}
Spring的Validate策略就是一个类(Person)对应一个校验类(PersonValidator)。至于校验类的绑定,可以代码中显式的调用,也可以是采用annotation。个人比较推荐用annotation的方法。而如果在一个类的校验中需要用到另一个类的校验,我们可以这样写:
- 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();
- }
- }
- }