Spring Boot 参数校验:【从零开始学Spring Boot】-4.Spring Boot Validation 参数校验
1.注解校验如何生效的?
在 UserController#add 方法上有使用 @Valid 注解,标明这个方法需要校验,同时也可以使用 @Validated 注解标明要校验的位置。那么 @Valid 是如何生效的呢?
在 SpringBoot学习(三)——WebMVC及其工作原理 中,有跟踪 Spring MVC 的运行原理,@Valid 的注解校验就在
RequestMappingHandlerAdapter#invokeHandlerMethod 方法中
在 ConstraintTree#validateSingleConstraint 中使用具体的 Validator 对参数进行校验
protected final <T, V> Set<ConstraintViolation<T>> validateSingleConstraint(ValidationContext<T> executionContext, ValueContext<?, ?> valueContext, ConstraintValidatorContextImpl constraintValidatorContext, ConstraintValidator<A, V> validator) {
boolean isValid;
try {
V validatedValue = valueContext.getCurrentValidatedValue();
isValid = validator.isValid(validatedValue, constraintValidatorContext);
} catch (RuntimeException var7) {
if (var7 instanceof ConstraintDeclarationException) {
throw var7;
}
throw LOG.getExceptionDuringIsValidCallException(var7);
}
return !isValid ? executionContext.createConstraintViolations(valueContext, constraintValidatorContext) : Collections.emptySet();
}