简单介绍下 Java 中的 @Validated 和 @Valid 注解的区别?
文章目录
- @Valid:专注单个对象的深度验证
- 适用场景
- 使用示例
- 小结
- @Validated:聚焦接口分组的批量验证
- 适用场景
- 使用示例
- 小结
- 主要区别总结
- 如何选择?
- 总结
- 推荐阅读文章
在 Java 开发中,为了确保输入数据符合我们的要求,少不了数据验证这一步。
@Valid 和
@Validated 是两个常见的验证注解,它们在 Spring 中常常出现,虽然名字差不多,但作用和使用场景却不太一样。
今天,我们就来聊聊 @Valid 和 @Validated 的区别,看它们如何在验证世界里各司其职,搭配使用!
@Valid:专注单个对象的深度验证
@Valid 是 Java 中的标准验证注解,适用于单个对象的验证。它的职责很清晰——递归地验证这个对象,尤其适用于嵌套对象的场景。
比如,你的表单里有个 User 对象,User 里还有 Address 对象,那么在验证 User 时,如果用了 @Valid,它会一层层地深入到 Address,对所有字段进行完整验证。
适用场景
@Valid 更适合在字段上进行深层次的验证,比如:
- 方法参数:在方法参数前标注
@Valid,让 Spring 验证参数。 - 嵌套对象:在对象内部的字段上使用
@Valid,确保递归验证。
使用示例
public class User {@NotNullprivate String name;@Valid // 在嵌套对象 Address 上使用 @Validprivate Address address;
}public class Address {@NotBlankprivate String city;
}
在这个例子中,@Valid 会确保 User 对象的 address 字段也被验证。因此,如果 address 的 city 是空字符串,也会报错。
小结
@Valid 是一种“全家桶”式的验证器,用来递归检查整个对象树的各个字段是否符合要求。
@Validated:聚焦接口分组的批量验证
@Validated 是 Spring 特有的验证注解,和 @Valid 不同的是,它的主要优势在于支持验证分组。分组验证的概念很简单:比如,我们在用户注册时要验证的内容和在用户更新资料时可能不同。@Validated 就允许你给验证分组,灵活地控制哪些验证规则在何时触发。
适用场景
- 分组验证:需要在不同情况下使用不同的验证规则时,
@Validated是非常合适的选择。
使用示例
假设我们有两个验证场景,一个是 AddGroup(新增用户时的验证),一个是 UpdateGroup(更新用户时的验证),可以这样做:
public class User {@NotNull(groups = AddGroup.class)private String name;@NotBlank(groups = UpdateGroup.class)private String email;
}public interface AddGroup {}
public interface UpdateGroup {}
在控制器方法中,指定使用哪个分组:
@PostMapping("/addUser")
public void addUser(@Validated(AddGroup.class) @RequestBody User user) {// 仅验证 AddGroup 分组
}@PutMapping("/updateUser")
public void updateUser(@Validated(UpdateGroup.class) @RequestBody User user) {// 仅验证 UpdateGroup 分组
}
这样,通过 @Validated 注解和分组,你可以在不同操作中有选择地应用不同的验证逻辑。
小结
@Validated 是一位“分组专家”,适合复杂场景下的批量验证。
主要区别总结
| 注解 | 验证对象 | 支持分组验证 | 适用场景 |
|---|---|---|---|
@Valid | 单个对象,递归验证 | 否 | 深度验证嵌套对象 |
@Validated | 批量验证,可以选择性验证 | 是 | 在不同业务场景下应用不同验证逻辑 |
如何选择?
- 需要递归验证单个对象的各个字段(尤其是嵌套的复杂对象):用
@Valid。 - 需要在不同操作中选择性验证字段(比如新增和更新的验证规则不同):用
@Validated,并分配分组。
总结
@Valid是“单体专家”,适合一层层深入对象结构,逐个检查字段。@Validated是“分组大拿”,让你灵活控制不同场景下的验证要求。
理解这两个注解的分工后,就可以让你的 Java 应用在数据验证上更严谨、更灵活啦!
推荐阅读文章
- 由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)
- 如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系
- HTTP、HTTPS、Cookie 和 Session 之间的关系
- 什么是 Cookie?简单介绍与使用方法
- 什么是 Session?如何应用?
- 使用 Spring 框架构建 MVC 应用程序:初学者教程
- 有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误
- 如何理解应用 Java 多线程与并发编程?
- 把握Java泛型的艺术:协变、逆变与不可变性一网打尽
- Java Spring 中常用的 @PostConstruct 注解使用总结
- 如何理解线程安全这个概念?
- 理解 Java 桥接方法
- Spring 整合嵌入式 Tomcat 容器
- Tomcat 如何加载 SpringMVC 组件
- “在什么情况下类需要实现 Serializable,什么情况下又不需要(一)?”
- “避免序列化灾难:掌握实现 Serializable 的真相!(二)”
- 如何自定义一个自己的 Spring Boot Starter 组件(从入门到实践)
- 解密 Redis:如何通过 IO 多路复用征服高并发挑战!
- 线程 vs 虚拟线程:深入理解及区别
- 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
- 10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!
- “打破重复代码的魔咒:使用 Function 接口在 Java 8 中实现优雅重构!”
- Java 中消除 If-else 技巧总结
- 线程池的核心参数配置(仅供参考)
- 【人工智能】聊聊Transformer,深度学习的一股清流(13)
- Java 枚举的几个常用技巧,你可以试着用用
相关文章:
简单介绍下 Java 中的 @Validated 和 @Valid 注解的区别?
文章目录 Valid:专注单个对象的深度验证适用场景使用示例小结 Validated:聚焦接口分组的批量验证适用场景使用示例小结 主要区别总结如何选择?总结推荐阅读文章 在 Java 开发中,为了确保输入数据符合我们的要求,少不了…...
SpringBoot配置Rabbit中的MessageConverter对象
SpringAMQP默认使用SimpleMessageConverter组件对消息内容进行转换 SimpleMessageConverter: only supports String, byte[] and Serializable payloads仅仅支持String、Byte[]和Serializable对象Jackson2JsonMessageConverter:was expecting (JSON Str…...
C++ 错题本--duplicate symbol问题
顾名思义, duplicate symbol是重复符号的意思! 代码是用来做什么的(问题缘由 & 代码结构) 写排序算法, 提出了一个公共的头文件用来写一些工具方法, 比如打印数组内容. 以便于不同文件代码需要打印数组内容的时候,直接引入相关头文件即可, 但是编译时出现了 duplicate sym…...
Cursor的chat与composer的使用体验分享
经过一段时间的试用,下面对 Composer 与 Chat 的使用差别进行总结: 一、长文本及程序文件处理方面 Composer 在处理长文本时表现较为稳定,可以对长文进行更改而不会出现内容丢失的情况。而 Chat 在更改长的程序文件时,有时会删除…...
【优选算法 — 滑动窗口】最大连续1的个数 将 x 减到0的最小操作数
最大连续1的个数 最大连续1的个数 题目描述 题目解析 给我们一个元素全是0或者1的数组,和一个整数 k ,然后让我们在数组选出最多的 k 个0;这里翻转最多 k 个0的意思,是翻转 0 的个数< k,而不是一定要翻转 k …...
《TCP/IP网络编程》学习笔记 | Chapter 8:域名及网络地址
《TCP/IP网络编程》学习笔记 | Chapter 8:域名及网络地址 《TCP/IP网络编程》学习笔记 | Chapter 8:域名及网络地址域名系统什么是域名?DNS 服务器IP 地址和域名之间的转换使用域名的必要性利用域名获取 IP 地址利用 IP 地址获取域名 基于 Wi…...
FastHTML快速入门:调试模式和 URL中的变量
调试模式 FastHTML基于FastAPI友好的装饰器模式来指定URL,并添加了额外功能: main.py from fasthtml.common import * app, rt fast_app() rt("/") def get():return Titled("FastHTML", P("让我们开始吧!"…...
C++高级编程(8)
八、标准IO库 1.输入输出流类 1)非格式化输入输出 2)put #include <iostream> #include <string> using namespace std; int main() {string str "123456789";for (int i str.length() - 1; i > 0; i--) {cout.put(str[i]); //从最后一个字符开…...
AUTOSAR_EXP_ARAComAPI的7章笔记(2)
☞返回总目录 相关总结:服务发现实现策略总结 7.2 服务发现的实现策略 如前面章节所述,ara::com 期望产品供应商实现服务发现的功能。服务发现功能基本上是在 API 级别通过 FindService、OfferService 和 StopOfferService 方法定义的,协议…...
【C++】 C++游戏设计---五子棋小游戏
1. 游戏介绍 一个简单的 C 五子棋小游戏 1.1 游戏规则: 双人轮流输入下入点坐标横竖撇捺先成五子连线者胜同一坐标点不允许重复输入 1.2 初始化与游戏界面 初始化界面 X 输入坐标后 O 输入坐标后 X 先达到胜出条件 2. 源代码 #include <iostream> #i…...
仿RabitMQ 模拟实现消息队列项目开发文档2(个人项目)
项目需求分析 核心概念 现在需要将这个项目梳理清楚了,便于之后的代码实现。项目中具有一个生产消费模型: 其中生产者和消费者的个数是可以灵活改变的,让系统资源更加合理的分配。消息队列的主逻辑和上面的逻辑基本一样,只不过我…...
李佳琦回到巅峰背后,双11成直播电商分水岭
时间倏忽而过,又一年的双11即将宣告结束。 从双11正式开始前的《新所有女生的offer》,到被作为“比价”标杆被其他平台直播间蹭、被与其他渠道品牌比较,再到直播间运营一时手快多发了红包……整个双11周期下来,李佳琦直播间在刷新…...
云计算在教育领域的应用
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 云计算在教育领域的应用 云计算在教育领域的应用 云计算在教育领域的应用 引言 云计算概述 定义与原理 发展历程 云计算的关键技…...
C语言 | Leetcode C语言题解之第543题二叉树的直径
题目: 题解: typedef struct TreeNode Node;int method (Node* root, int* max) {if (root NULL) return 0;int left method (root->left, max);int right method (root->right, max);*max *max > (left right) ? *max : (left right);…...
6、If、While、For、Switch
6、If、While、For、Switch 一、If 1、if-else if (boolean) {代码块 } else if (boolean) {代码块 } else if (boolean) {代码块 } else { // 默认情况代码块 }关于IDEA单元测试控制台不能输入数据的问题: https://blog.csdn.net/m0_72900498/article/details/…...
萤石设备视频接入平台EasyCVR多品牌摄像机视频平台海康ehome平台(ISUP)接入EasyCVR不在线如何排查?
随着智慧城市和数字化转型的推进,视频监控系统已成为保障公共安全、提升管理效率的重要工具。特别是在大中型项目中,跨区域的网络化视频监控需求日益增长,这要求视频监控管理平台不仅要具备强大的视频资源管理能力,还要能够适应多…...
【多线程】线程池如何知道一个线程的任务已经完成
目录 1. 说明2. 任务的生命周期3. 状态更新4. 线程间的协作5. 内部数据结构6. 回调与通知7. 线程池的关闭与清理 1. 说明 1.线程池通过一系列内部机制来知道一个线程的任务已经完成。2.这些机制主要涉及任务的生命周期管理、状态更新以及线程间的协作。 2. 任务的生命周期 1…...
Transformer介绍(一)
Transformer是一种特殊的神经网络,一种机器学习模型。 谷歌在2017年推出的原版Transformer,论文《Attention Is All You Need》,专注于将一种语言的文本翻译成另一种。 而我们要关注的Transformer变种,即构建ChatGPT等工具的模型…...
[CKS] TLS Secrets创建与挂载
目前的所有题目为2024年10月后更新的最新题库,考试的k8s版本为1.31.1 BackGround 您必须使用存储在TLS Secret中的SSL文件,来保护Web 服务器的安全访问。 Task 在clever-cactus namespace中为名为clever-cactus的现有Deployment创建名为clever-cactu…...
java双向链表解析实现双向链表的创建含代码
双向链表 一.双向链表二.创建MyListCode类实现双向链表创建一.AddFirst创建(头插法)二.AddLast创建(尾叉法)三.size四.remove(指定任意节点的首位删除)五.removeAll(包含任意属性值的所有删除)六.AddIndex(给任意位置添加一个节点…...
开局掌控者:EdB Prepare Carefully - RimWorld自定义体验革命
开局掌控者:EdB Prepare Carefully - RimWorld自定义体验革命 【免费下载链接】EdBPrepareCarefully EdB Prepare Carefully, a RimWorld mod 项目地址: https://gitcode.com/gh_mirrors/ed/EdBPrepareCarefully 副标题:如何告别随机开局…...
OpenClaw技能市场巡礼:最适合Qwen3-32B的5个实用模块
OpenClaw技能市场巡礼:最适合Qwen3-32B的5个实用模块 1. 为什么需要关注技能市场? 第一次接触OpenClaw时,我以为它只是个简单的自动化脚本集合。直到在本地部署了Qwen3-32B模型后,才发现真正的威力藏在技能市场里。这里分享一个…...
告别硬编码!用BAdI LE_SHP_TAB_CUST_ITEM给VL01N交货单加个自定义标签页(附完整代码)
告别硬编码!用BAdI LE_SHP_TAB_CUST_ITEM实现交货单标签页优雅增强 在SAP SD模块的日常开发中,为外向交货单添加客户化信息是再常见不过的需求。但很多开发者习惯直接在标准程序里插入硬编码,这种看似快捷的方式往往会给后续维护埋下隐患。今…...
4大技术支柱:面向硬件开发者的开源码表定制指南
4大技术支柱:面向硬件开发者的开源码表定制指南 【免费下载链接】X-TRACK A GPS bicycle speedometer that supports offline maps and track recording 项目地址: https://gitcode.com/gh_mirrors/xt/X-TRACK X-TRACK作为一款支持离线地图和轨迹记录的GPS自…...
百川2-13B-4bits模型精调:解决OpenClaw复杂任务分解难题
百川2-13B-4bits模型精调:解决OpenClaw复杂任务分解难题 1. 问题背景:OpenClaw的复杂任务执行困境 去年冬天,当我第一次尝试用OpenClaw自动化处理一份市场调研报告时,遭遇了令人抓狂的体验。这个看似简单的任务需要完成网页数据…...
实战演练:基于快马平台快速构建一个电商场景的智能客服AI Agent
实战演练:基于快马平台快速构建一个电商场景的智能客服AI Agent 最近在做一个电商项目,需要给平台增加智能客服功能。传统开发流程要写大量业务逻辑代码,还要处理前后端对接,想想就头大。后来发现用InsCode(快马)平台可以快速实现…...
3分钟搞定!LyricsX让你的macOS音乐播放器拥有完美歌词体验
3分钟搞定!LyricsX让你的macOS音乐播放器拥有完美歌词体验 【免费下载链接】LyricsX 🎶 Ultimate lyrics app for macOS. 项目地址: https://gitcode.com/gh_mirrors/ly/LyricsX 还在为macOS上的音乐播放器找不到合适的歌词而烦恼吗?L…...
好用还专业!高效论文写作全流程AI论文网站推荐(2026 最新)
论文写作全流程可拆解为文献调研→选题/开题→大纲/初稿→文献综述→降重/去AI味→润色/格式→查重/投稿七大环节,以下工具按环节精准匹配,兼顾中文适配、降重能力、去AI痕迹、学术合规四大核心需求,覆盖免费/付费、通用/垂直场景。2026年AI论…...
OpenClaw对比测试:Qwen3.5-9B与其他模型在自动化任务中的表现
OpenClaw对比测试:Qwen3.5-9B与其他模型在自动化任务中的表现 1. 测试背景与实验设计 最近在搭建个人自动化工作流时,我遇到了一个关键问题:OpenClaw框架下究竟该选择哪个大模型作为决策核心?为了找到答案,我花了三天…...
GPIO的输出输入方式总结
GPIO的四种输入方式GPIO的四种输出方式...
