【Spring】Spring中的数据校验

【Spring】Spring中的数据校验,第1张

【Spring】Spring中的数据校验

数据校验模块在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());
		}

第三方的实现不仅可以校验值,还可以校验返回值,方法参数等。调用对应的方法就可以了。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5718968.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存