Spring Boot参数校验基于JSR-303/380规范,底层由Hibernate Validator实现,通过HandlerMethodArgumentResolver在参数绑定后调用validateIfApplicable()触发校验;Spring Boot 2.3+需引入spring-boot-starter-validation,自动配置LocalValidatorFactoryBean;校验失败分别抛出MethodArgumentNotValidException或ConstraintViolationException,并由@ControllerAdvice统一处理。

Spring Boot 参数校验的底层原理,核心在于 JSR-303/JSR-380(Bean Validation)规范 的落地实现,不是 Spring 自己从零写的校验引擎,而是基于 Hibernate Validator 这一成熟实现,并由 Spring MVC 和 Spring Boot 做了关键的自动装配与拦截集成。
校验触发的关键入口:HandlerMethodArgumentResolver
当一个 HTTP 请求到达 Controller 方法时,Spring MVC 会通过 HandlerAdapter 调用目标方法。而参数如何从请求中提取并转换为 Java 对象,是由一系列 HandlerMethodArgumentResolver 完成的。其中:
-
RequestResponseBodyMethodProcessor负责处理带@RequestBody的参数; -
RequestParamMethodArgumentResolver和PathVariableMethodArgumentResolver分别处理@RequestParam和@PathVariable。
这些 resolver 在完成参数绑定后,**如果方法参数上标注了 @Valid 或 @Validated,就会调用 validateIfApplicable() 方法,进而委托给 Validator 实例执行校验。
Validator 的来源与自动装配
Spring Boot 2.3+ 默认不再自动引入 hibernate-validator,需显式添加 spring-boot-starter-validation。该 starter 会:
- 引入
jakarta.validation-api(规范接口)和hibernate-validator(具体实现); - 通过
ValidationAutoConfiguration自动注册一个全局LocalValidatorFactoryBean(它实现了 Spring 的Validator接口,也兼容 JSR 标准的javax.validation.Validator); - 这个 bean 会被注入到 MVC 配置中,成为所有参数校验的默认执行器。
校验异常的统一拦截机制
校验失败不会直接抛出原始的 ConstraintViolationException 或 MethodArgumentNotValidException 给前端,而是由 Spring MVC 的异常处理器捕获:
-
MethodArgumentNotValidException:由@RequestBody + @Validated触发,对应@ExceptionHandler(MethodArgumentNotValidException.class); -
ConstraintViolationException:由@RequestParam/@PathVariable + @Validated(类级)触发,对应@ExceptionHandler(ConstraintViolationException.class)。
你可以在全局异常处理器(如 @ControllerAdvice)里统一提取 BindingResult 或 Set<constraintviolation>></constraintviolation>,格式化成标准错误响应。
自定义校验器的生效链路
当你写一个 @interface Status 注解并配一个 StatusValidator implements ConstraintValidator<status integer></status> 时,整个链路是:
- 注解被标注在字段或参数上;
- Hibernate Validator 在遍历对象图时识别该注解,并查找到对应的
StatusValidator实例; -
StatusValidator必须被 Spring 容器管理(加@Component),否则 Hibernate Validator 无法自动注入依赖(如@Autowired的 service); - 若需依赖注入,推荐让 validator 实现
InitializingBean或使用@PostConstruct,或改用 Spring 提供的SpringConstraintValidatorFactory(已在LocalValidatorFactoryBean中默认配置)。


















