简单介绍下 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(给任意位置添加一个节点…...
wflow工作流设计器:5分钟快速上手的企业流程自动化完整指南
wflow工作流设计器:5分钟快速上手的企业流程自动化完整指南 【免费下载链接】wflow workflow 工作流设计器,企业OA流程设计。表单流程设计界面操作超级简单!!普通用户也能分分钟上手,不需要专业知识。本设计器支持可视…...
OpenCore Configurator:革新性黑苹果配置工具,让复杂引导设置化繁为简
OpenCore Configurator:革新性黑苹果配置工具,让复杂引导设置化繁为简 【免费下载链接】OpenCore-Configurator A configurator for the OpenCore Bootloader 项目地址: https://gitcode.com/gh_mirrors/op/OpenCore-Configurator 价值定位&#…...
做了十几年财务,我用RPA把最累的工作交给了“机器人”
在财务这行摸爬滚打了十几年,算是一路看着这个行业慢慢“进化”过来的:从最早拿计算器对数据,到后来用电脑做账,从手工账本过渡到ERP系统,再到这两年铺天盖地的“数智化转型”。中间也确实尝试过不少所谓的“黑科技”。…...
SEO_避开这些常见误区让你的SEO效果事半功倍
<h2>SEO误区一:忽视关键词优化</h2> <p>在进行SEO优化时,关键词的选择和使用是至关重要的。很多人忽视了关键词优化,导致他们的网站在搜索引擎中的排名一直停滞不前。关键词不仅仅是为了让搜索引擎理解你的网站内容&#x…...
ArXiv:为何大模型无法拥有意识|Erik Hoel
导语当AI能流畅谈论“自我感受”,当Anthropic赋予Claude“对话退出权”,我们是否可以说它有意识?2026年初,神经科学家Erik Hoel在ArXiv发布论文《大语言模型意识证伪:持续学习对意识存在的必要性》(A Dispr…...
从零搭建企业级开源大模型平台:Ollama+Llama3+open-webui实战指南
1. 为什么选择OllamaLlama3open-webui组合? 最近两年大语言模型的发展速度简直让人瞠目结舌,从最初的GPT-3到现在的Llama3,模型能力突飞猛进的同时,部署门槛也在不断降低。作为一个在AI领域摸爬滚打多年的老手,我实测过…...
BERT-base-uncased完全指南:从基础原理到实战应用
BERT-base-uncased完全指南:从基础原理到实战应用 【免费下载链接】bert-base-uncased 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/bert-base-uncased 一、认知铺垫:为什么BERT改变了NLP格局? 1.1 BERT的突破性意义何…...
Webots仿真实战:如何用C语言控制四轮小车实现自动行驶
Webots仿真实战:C语言控制四轮小车自动行驶全攻略 引言 在机器人开发领域,仿真环境的重要性不言而喻。它不仅能大幅降低硬件成本,还能加速开发周期,让开发者专注于算法和控制逻辑的优化。Webots作为一款专业的机器人仿真软件&…...
Cursor+Qt5.12.12开发环境配置全攻略:从插件安装到项目构建
CursorQt5.12.12开发环境配置全攻略:从插件安装到项目构建 对于刚接触Qt开发或从其他IDE迁移到Cursor的开发者来说,配置一个高效的开发环境是首要任务。Qt5.12.12作为长期支持版本(LTS),在稳定性和兼容性方面表现优异,而Cursor作为…...
若依前后端分离系统生产环境部署:从零到上线的保姆级教程
若依前后端分离系统生产环境部署实战指南 引言:为什么选择若依框架? 对于刚接触企业级开发的新手来说,若依(RuoYi)框架无疑是一个绝佳的起点。这个基于Spring Boot和Vue.js的前后端分离架构,不仅提供了完善的权限管理、代码生成等…...
