@Valid与@Validate修改为快速失败
1. 背景
在开发项目的过程中,后端经常使用 @Valid 或者 @Validate 注解来校验前端传过来的参数,默认是校验所有的参数,如果没有校验通过就会抛出异常。并且后端一般会使用 @RestControllerAdvice 和 @ExceptionHandler 注解进行了全局异常的捕获,再响应异常信息,但是由于校验了所有的参数,并且 @ExceptionHandler 处理逻辑是将所有没有校验通过的字段错误信息响应给前端,所以响应错误信息就会有多条。
2. 目的
在不改动 @ExceptionHandler 注解方法逻辑的情况下,只要校验一个参数失败,就马上抛出异常,不对之后的参数进行校验。这样不仅符合实际需求,又节省了系统资源。
3. 如何定位源码修改点
在百度简单搜索之后,发现使用 @Valid 或者 @Validate 注解来校验前端传过来的参数,是通过一个验证器 Validator 来实现的。由于在Spring 中,一般都会把核心对象注入 Spring 容器,哪里需要就直接从容器中获取就行。想到这里,利用 IDEA 的 Bean 自动注入可以查找到对应 Bean 声明的地方特点。
@Autowired
private javax.validation.Validator validator;
点击绿色点,直接导航到声明 Bean 的代码的地方,Navigate to the autowired dependencies
package org.springframework.boot.autoconfigure.validation;
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(ExecutableValidator.class)
@ConditionalOnResource(resources = "classpath:META-INF/services/javax.validation.spi.ValidationProvider")
@Import(PrimaryDefaultValidatorPostProcessor.class)
public class ValidationAutoConfiguration {
/**
* 看到了 @ConditionalOnMissingBean(Validator.class) 意味着找对了地方
*/
@Bean
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
@ConditionalOnMissingBean(Validator.