我试图实现使用的组合弹簧引导终点一些自定义的验证逻辑JSR-303 Bean Validation API
和Spring's Validator
。
根据Validator类图,似乎可以扩展其中之一CustomValidatorBean
,SpringValidatorAdapter
或LocalValidatorFactoryBean
将一些自定义验证逻辑添加到重写的方法中validate(Object target, Errors errors)
。
但是,如果我创建一个验证器来扩展这三个类中的任何一个并使用@InitBinder
其validate(Object target, Errors errors)
方法注册它,则永远不会调用它,并且不会执行任何验证。如果删除,@InitBinder
则默认的弹簧验证器执行JSR-303 Bean Validation
。
休息控制器:
@RestController
public class PersonEndpoint {
@InitBinder("person")
protected void initBinder(WebDataBinder binder) {
binder.setValidator(new PersonValidator());
}
@RequestMapping(path = "/person", method = RequestMethod.PUT)
public ResponseEntity<Person> add(@Valid @RequestBody Person person) {
person = personService.save(person);
return ResponseEntity.ok().body(person);
}
}
自定义验证器:
public class PersonValidator extends CustomValidatorBean {
@Override
public boolean supports(Class<?> clazz) {
return Person.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
super.validate(target, errors);
System.out.println("PersonValidator.validate() target="+ target +" errors="+ errors);
}
}
如果我的验证器实现了,org.springframework.validation.Validator
则将validate(Object target, Errors errors)
调用其方法,但JSR-303 Bean Validation
不会在此方法之前执行。我可以实现与SpringValidatorAdapter
实现它类似的自定义JSR-303验证,JSR-303 Bean Validation
但是必须有一种扩展它的方法:
@Override
public void validate(Object target, Errors errors) {
if (this.targetValidator != null) {
processConstraintViolations(this.targetValidator.validate(target), errors);
}
}
我已经研究过使用自定义JSR-303约束来避免同时使用org.springframework.validation.Validator
所有约束,但是必须有一种使自定义验证器起作用的方法。
Spring验证文档在结合两者方面不是很清楚:
应用程序还可以为每个DataBinder实例注册其他Spring Validator实例,如第9.8.3节“配置DataBinder”中所述。这对于在不使用批注的情况下插入验证逻辑可能很有用。
然后,它涉及配置多个Validator实例
还可以通过dataBinder.addValidators和dataBinder.replaceValidators为DataBinder配置多个Validator实例。当将全局配置的Bean验证与在DataBinder实例上本地配置的Spring验证器结合使用时,这很有用。看 ???。
我正在使用Spring Boot 1.4.0。
每个@ M.Deinum-使用addValidators()而不是setValidator()可以解决问题。我也同意使用JSR-303,基于@AssertTrue方法的注释(专门用于跨字段验证)可能是一种更干净的解决方案。可以在https://github.com/pavelfomin/spring-boot-rest-example/tree/feature/custom-validator上找到代码示例。在该示例中,中间名称验证是通过自定义spring验证器执行的,而姓氏验证是由默认jsr 303验证器处理的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句