Spring Boot 参数校验不生效的三大原因是:控制器参数未加@Valid/@Validated注解、Controller类缺少@RestController/@Controller注解、未引入spring-boot-starter-validation依赖。

参数校验不生效?先看这三处关键配置
Spring Boot 默认启用 @Valid 和 @Validated,但实际不生效,大概率是以下原因:
- 控制器方法参数没加 @Valid 或 @Validated 注解(仅在实体类上加
@NotBlank等注解不够) - 没在 Controller 类上加 @RestController 或 @Controller(纯 POJO 方法不会触发 MVC 校验拦截)
- 项目未引入 spring-boot-starter-validation(Spring Boot 2.3+ 后该依赖不再默认包含,需显式添加)
400 错误没返回具体提示?检查 BindingResult 用法
校验失败默认返回 400,但若想自定义响应体(如统一 JSON 格式),必须显式接收 BindingResult,且它必须紧跟被校验参数之后:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- ✅ 正确写法:
public Result save(@Valid @RequestBody User user, BindingResult result) - ❌ 错误写法:把
BindingResult放在其他参数后、或漏写、或类型写成Errors - 校验失败时,调用
result.hasErrors()并手动提取result.getAllErrors()中的DefaultMessageSourceResolvable获取提示信息
分组校验总不触发?确认 @Validated 的分组值匹配
使用分组(如 CreateGroup.class, UpdateGroup.class)时,常见问题:
- 接口参数用了
@Validated(CreateGroup.class),但实体类字段上只写了@NotBlank,没指定groups = CreateGroup.class - 嵌套对象校验失效:内部对象字段也需加
@Valid,否则其分组注解不生效 - Controller 层没传分组,但 Service 层又用了
@Validated—— 分组需逐层显式传递,不会自动透传
自定义注解不校验?检查 ConstraintValidator 实现和注册
自定义校验注解(如 @Phone)无效,通常因为:
- 校验器类(实现
ConstraintValidator<Phone, String>)没加 @Component 注解,Spring 无法扫描到 - 注解定义中
validatedBy指向的类名写错,或类不在 Spring 扫描路径下 - 校验逻辑里抛了异常但没 return false;正确做法是逻辑不满足时 return false,无需 throw

















