数据校验模块在spring的指导手册中的第三个标题项。
先试验下给的例子:
校验器:
public class PersonValidator implements Validator {
@Override
public boolean supports(Class> clazz) {
return clazz.equals(Person.class);
}
@Override
public void validate(Object target, Errors errors) {
Person person = (Person) target;
if (person.getAge() > 12) {
errors.rejectValue("age", "age >12");
}
if (person.getName().length() < 5) {
errors.rejectValue("name", "name length <5");
}
}
}
校验代码:
Person person = new Person();
person.setName("12");
person.setAge(23);
PersonValidator validator = new PersonValidator();
BeanPropertyBindingResult result = new BeanPropertyBindingResult(person, "person");
validator.validate(person, result);
List allErrors = result.getAllErrors();
for (ObjectError error : allErrors) {
FieldError fieldError = (FieldError)error;
System.out.println(fieldError.getField()+" " + fieldError.getCode());
}
逻辑就是通过PersonValidator的validate方法校验,如果有问题,就将错误封装在BeanPropertyBindingResult中,validate方法的第二个参数是一个Errors 类型,我这里选用了BeanPropertyBindingResult实现类;也可以用其他的;
数据校验是有个JSR标准的。熟悉是有hibernate-validator,如果想用这个怎么办呢?
首先引入第三方的实现(pom),容器中注入:CustomValidatorBean。
public void afterPropertiesSet() {
if (this.validatorFactory == null) {
//自动加载第三方实现
this.validatorFactory = Validation.buildDefaultValidatorFactory();
}
ValidatorContext validatorContext = this.validatorFactory.usingContext();
MessageInterpolator targetInterpolator = this.messageInterpolator;
if (targetInterpolator == null) {
targetInterpolator = this.validatorFactory.getMessageInterpolator();
}
validatorContext.messageInterpolator(new LocaleContextMessageInterpolator(targetInterpolator));
if (this.traversableResolver != null) {
validatorContext.traversableResolver(this.traversableResolver);
}
setTargetValidator(validatorContext.getValidator());
}
校验时,注入这个bean,直接校验即可:
// 调用validatevalue方法。 Set> constraintViolations = validator.validatevalue(Person.class, "name", "tom"); for (ConstraintViolation cv : constraintViolations) { System.out.println(cv.getMessage()); }
第三方的实现不仅可以校验值,还可以校验返回值,方法参数等。调用对应的方法就可以了。



