校验注解不生效是因校验链路未接通,需从依赖(如显式引入spring-boot-starter-validation)、位置(注解须标在字段而非getter)、触发时机(@RequestBody需加@Valid,@RequestParam需类加@Validated)、异常捕获(需@ExceptionHandler处理MethodArgumentNotValidException)四方面逐层排查。

校验注解(如 @Valid、@Validated、@NotBlank 或自定义注解如 @EnumValue)不生效,不是代码写错了,而是整个校验链路中某个环节“没接上”。排查要从依赖、配置、位置、触发时机四个关键点入手,逐层验证。
检查依赖是否完整且版本兼容
Spring Boot 2.3+ 已将校验能力拆出为独立 starter,spring-boot-starter-web 不再自动包含它。
- 确认
pom.xml中显式声明了:<dependency><br> <groupId>org.springframework.boot</groupId><br> <artifactId>spring-boot-starter-validation</artifactId><br></dependency>
- 运行
mvn dependency:tree | grep validator,确保输出含hibernate-validator和jakarta.validation-api(注意是 jakarta,不是旧版javax) - 若用 JDK 17+,避免混入老版本 EL 表达式引擎(如
javax.el),需排除冲突依赖,或添加jakarta.el
确认注解使用位置是否合法
每个注解的 @Target 限定了可用位置,放错地方会被直接忽略。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
@NotBlank、@NotNull、@Email等约束注解,必须标注在 字段(field) 上,而非 getter 方法 -
@Valid用于嵌套对象字段(如private Address address;),需加在该字段上;@Validated用于方法参数或类级别,不能代替@Valid做嵌套校验 - 自定义注解(如
@EnumValue)需检查其@Target是否包含ElementType.FIELD,且必须配ConstraintValidator实现类
验证校验是否被真正触发
注解存在 ≠ 校验执行。触发依赖 Spring 的代理机制和参数绑定流程。
- 对于
@RequestBody对象:Controller 方法参数需加@Valid(或@Validated),且 DTO 类字段已加约束注解 - 对于
@RequestParam/@PathVariable等简单类型:必须在 Controller 类上加@Validated,单靠方法参数加@Valid无效 - Service 层用
@Validated时,必须是 Spring 管理的 Bean,且调用需经 Spring 代理(即不能是 this.xxx() 这种内部直接调用) - 单元测试中容易失效:因缺少 Web 环境,
RequestResponseBodyMethodProcessor不参与绑定,建议用@WebMvcTest或 MockMvc 测试
查看异常是否被正确捕获和响应
校验失败本应抛 MethodArgumentNotValidException,但若未配置全局异常处理器,可能静默吞掉或转为 500 错误。
- 检查是否定义了
@RestControllerAdvice并处理MethodArgumentNotValidException - 调试时可在
WebDataBinder.validate()或validateIfApplicable()方法设断点,确认校验逻辑是否进入 - 日志中搜索 “BindingResult” 或 “ConstraintViolation”,有输出说明校验已执行;无任何相关日志,说明根本未走到校验环节

















