Spring Boot 2.3.10 @PostMapping接口@Valid参数校验不生效
问题根因
当前参数校验完全不生效,是两个配置缺陷叠加导致的:
validation-api仅为校验规范的接口定义,本身没有任何实际校验执行逻辑。Spring Boot 2.3.x 版本开始,web组件不再默认携带校验实现框架,就算引入了spring-boot-starter-validation,如果依赖树中缺失实际的校验实现类,所有校验注解都不会触发任何拦截逻辑。- 自定义的Hospital类仅提供了全参构造函数,缺少Jackson反序列化必需的无参构造、以及对应字段的getter/setter方法,会导致请求参数解析阶段就出现异常,甚至根本走不到校验执行的环节。
分步修复方案
- 调整pom.xml依赖配置
首先移除单独引入的javax.validation:validation-api依赖,该依赖会被Spring Boot的父pom自动做版本管控,手动单独引入反而容易出现版本不兼容问题。仅保留官方提供的spring-boot-starter-validation依赖即可,该starter会自动引入适配当前Spring Boot版本的全部校验相关组件(包括Hibernate Validator实现、规范接口包),不需要额外手动添加其他校验类依赖。注意:单独引入validation-api是很多开发者踩过的坑——光有接口没有实现,就像买了插座没有插电,自然不会有任何反应。
- 补全Hospital实体类的必需结构
为Hospital类补充Jackson反序列化依赖的基础结构,修改后的实体类参考如下:public class Hospital { private Integer id; @Size(min = 2, message = "医院名称长度不能少于2位") private String name; @Size(min = 2, message = "所在城市长度不能少于2位") private String city; // 无参构造,Jackson反序列化必需 public Hospital() {} // 保留原有全参构造 public Hospital(Integer id, String name, String city) { this.id = id; this.name = name; this.city = city; } // 补全所有字段对应的getter、setter方法,否则Jackson无法完成属性绑定 } - 确认Controller层注解写法正确
当前接口上的@Valid @RequestBody Hospital hospital写法本身符合规范:当传入参数不符合校验规则时,Spring会在进入接口业务逻辑前直接抛出MethodArgumentNotValidException,根本不会执行后续创建实体的操作。如果需要自定义校验失败的返回格式,可以通过全局异常处理器捕获上述异常,统一返回结构化的错误信息即可。
快速排查校验是否生效
- 执行
mvn dependency:tree | grep hibernate-validator,确认依赖树中存在Hibernate Validator的实现包,而非只有接口定义的validation-api。 - 检查所有校验注解的导入路径,确保
@Size是从javax.validation.constraints包下导入的,避免导入其他框架的同名注解导致逻辑不识别。
内容的提问来源于stack exchange,提问作者Sumit Monapara
相关产品推荐
相关产品推荐

