当前位置: 首页 > news >正文

@Validated与@Valid的正确使用姿势

验证代码
@Validated
@RestController
public class A {@PostMappingpublic void test(@Min(value = 1) Integer count) {} // 校验规则生效
}@RestController
public class A {@PostMappingpublic void test(@Validated @Min(value = 1) Integer count) {} // 校验规则不生效
}@RestController
public class A {@PostMappingpublic void test(@Valid @Min(value = 1) Integer count) {} // 校验规则不生效
}@Data
public class User {@NotBlankprivate String name;@Valid@NotNullprivate Address address;
}@Data
public class Address {@NotBlankprivate String city;
}@Validated
@RestController
public class A {@PostMappingpublic void test(User user) {} // 校验规则不生效
}@Validated
@RestController
public class A {@PostMappingpublic void test(@NotNull User user) {} // 校验规则不生效
}@RestController
public class A {@PostMappingpublic void test(@Validated User user) {} // 校验规则生效
}@RestController
public class A {@PostMappingpublic void test(@Valid User user) {} // 校验规则生效
}

Spring参数校验:@Validated与@Valid的正确使用姿势

在Spring Boot开发中,参数校验是保证接口健壮性的重要手段。然而,许多开发者在使用@Validated@Valid时容易混淆,导致校验规则未按预期生效。本文将通过代码示例解析不同场景下校验规则生效的原理,并总结最佳实践。


1. 基本类型参数的校验

场景1:类级别使用@Validated

@Validated // 关键注解
@RestController
public class A {@PostMappingpublic void test(@Min(value = 1) Integer count) {} // 校验生效
}
  • 生效原因
    @Validated注解在类级别启用方法参数校验。此时,直接作用在参数上的约束注解(如@Min)会被Spring处理。

场景2:参数级别使用@Validated或@Valid

@RestController
public class A {@PostMappingpublic void test(@Validated @Min(1) Integer count) {} // 不生效
}@RestController
public class A {@PostMappingpublic void test(@Valid @Min(1) Integer count) {} // 不生效
}
  • 不生效原因
    基本类型的参数校验需要类级别的@Validated支持。单独在参数上使用@Validated@Valid无法触发校验。

2. 对象类型参数的校验

场景1:未标记@Valid或@Validated

@Validated
@RestController
public class A {@PostMappingpublic void test(User user) {} // 不生效
}
  • 不生效原因
    虽然类上有@Validated,但未在参数上添加@Valid@Validated,Spring不会自动校验对象内部的字段约束。

场景2:参数级别使用@Valid或@Validated

@RestController
public class A {@PostMappingpublic void test(@Validated User user) {} // 生效
}@RestController
public class A {@PostMappingpublic void test(@Valid User user) {} // 生效
}
  • 生效原因
    对于对象类型的参数,Spring MVC会自动处理参数上的@Valid@Validated,无需类级别注解。这会递归校验对象内部的所有字段约束。

3. 嵌套对象的级联校验

实体类定义

@Data
public class User {@NotBlankprivate String name;@Valid // 启用嵌套校验@NotNullprivate Address address;
}@Data
public class Address {@NotBlankprivate String city;
}
  • 关键点
    在嵌套对象字段(如address)上添加@Valid,Spring会递归校验其内部约束。

4. 常见误区总结
场景是否生效原因
基本类型 + 类级别@Validated类级别启用校验,参数约束生效。
基本类型 + 参数级别@Valid/@Validated缺少类级别支持,无法触发校验。
对象类型 + 参数级别@Valid/@ValidatedSpring MVC自动处理对象参数校验。
对象类型 + 无参数注解需要显式标记@Valid@Validated以触发校验。

5. 最佳实践
  1. 基本类型参数校验
    在类上添加@Validated,参数直接使用约束注解(如@Min)。

  2. 对象类型参数校验
    在参数上使用@Valid@Validated,无需类级别注解。

  3. 嵌套校验
    在嵌套对象的字段上添加@Valid以触发级联校验。


通过合理使用@Validated@Valid,可以确保参数校验逻辑清晰且高效。理解其背后的机制,能够避免常见的“校验不生效”问题,提升代码质量。

相关文章:

  • Python制作简易PDF查看工具PDFViewerV1.0显示优化
  • 【生态与未来】立足原生仓颉:Cangjie Magic 的生态位与未来发展潜力分析
  • 基于 GPT-SoVITS 实现个性化语音复刻的API服务调用:让小说朗读拥有专属声线
  • 静态成员相关知识
  • AOSP的Doze模式-LightIdle初识
  • 测试基础笔记第六天
  • 『Linux_网络』 第二章 UDP_Socket编程
  • 从《周游记3》演绎歌剧版《菊花台》,周杰伦婚礼曲目意大利文版惊喜亮相
  • docker 搭建nacos 2.2.1版本单机版
  • 下一代互联网
  • java怎么完善注册,如果邮箱中途更换,能否判断
  • 2025/4/19 数据库的流程控制函数
  • Redis客户端下载使用
  • 【操作系统原理01】操作系统引论
  • Mysql从入门到上手(二)-全面了解增删改查(CRUD).
  • 《目标检测双雄:YOLO与Faster R-CNN,谁主沉浮?》
  • 文本生成与采样策略 (Text Generation Sampling)
  • c# 字典存储的委托失效?
  • 结合建筑业务讲述TOGAF标准处理哪种架构
  • 毕业论文超清pdf带标签导出
  • 长三角主流媒体将走进“来电”宜昌,探寻高质量发展密码
  • 美国税局代理局长卷入马斯克与美财长之争,还未工作就被迫离职
  • 中央和国家机关工委建立健全整治形式主义为基层减负长效机制
  • 皓元医药郑保富:共创、共赢、共享,跨域协作推动生物医药创新
  • 女子报警称醉酒后疑似被性侵,长沙警方:嫌犯邱某某已被刑拘
  • 涉嫌在饭局后性侵一女子,湖南机场董事长邱继兴被警方刑拘