You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 14:06:02