分组校验在Spring中的应用详解
目录
- 前言
- 1. 什么是分组校验
- 2. 分组校验的基本原理
- 3. 分组校验的实现步骤
- 3.1 定义分组接口
- 3.2 在校验项中指定分组
- 3.3 校验时指定要校验的分组
- 3.4 默认分组和分组的继承
- 4. 分组校验的优势和适用场景
- 4.1 优势
- 4.2 适用场景
- 5. 常见问题与解决方案
- 5.1 校验未生效
- 5.2 无法识别默认分组
- 结语
前言
在日常开发中,数据校验是一项重要的功能,尤其是在表单提交、数据传输和接口开发中,确保数据的准确性和完整性尤为关键。Spring框架提供了基于JSR-303/JSR-380的校验机制,方便开发者对数据进行自动化验证。然而,某些业务场景下,不同的功能或接口对数据的校验规则各不相同,比如新增数据和更新数据可能需要不同的校验规则。在这种情况下,分组校验的使用显得尤为重要。本文将详细介绍如何在Spring中使用分组校验机制,通过分组校验来实现不同场景下的个性化校验。
1. 什么是分组校验
分组校验是一种将校验项进行归类分组的校验机制,旨在满足不同场景下的数据校验需求。借助分组校验机制,开发者可以根据业务需求定义不同的校验组,并在校验时指定某个组,从而只对指定的校验项进行验证。这种方式极大地提高了校验的灵活性,减少了重复代码,满足了多场景的数据校验需求。

2. 分组校验的基本原理
在Spring中,分组校验是基于JSR-303/JSR-380规范来实现的。我们可以在数据实体类中使用注解,如 @NotNull、@Size 等来定义校验规则,而通过 groups 属性来指定该校验项所属的组。校验时则通过 @Validated 注解的 value 属性来指定需要校验的组,从而只对该组内的校验规则进行检查。
3. 分组校验的实现步骤
实现分组校验大致分为四个步骤:定义分组接口、在校验项中指定分组、执行校验时指定分组以及理解默认分组。以下是详细步骤:
3.1 定义分组接口
首先,需要在实体类中定义不同的分组接口。通常采用嵌套接口的形式来实现分组定义。在Spring的分组校验中,接口仅作为分组的标识符,没有任何实现逻辑。
public class User {public interface CreateGroup {}public interface UpdateGroup {}@NotNull(groups = CreateGroup.class)private String username;@NotNull(groups = {CreateGroup.class, UpdateGroup.class})@Size(min = 6, max = 15, groups = {CreateGroup.class, UpdateGroup.class})private String password;// 其他字段和方法
}
在上述示例中,我们定义了 CreateGroup 和 UpdateGroup 两个分组,username 字段仅在 CreateGroup 中校验,而 password 字段在 CreateGroup 和 UpdateGroup 中都需要校验。
3.2 在校验项中指定分组
在定义校验注解时,通过 groups 属性将校验项归属于某个或多个分组。当指定了分组后,校验器会根据分组执行不同的校验规则。上例中的 username 字段仅会在 CreateGroup 校验中被验证,而 password 字段会在 CreateGroup 和 UpdateGroup 中均被验证。
通过这种方式,开发者可以根据不同的分组来控制不同的校验行为,从而实现灵活的校验控制。
3.3 校验时指定要校验的分组
在控制层或服务层执行校验时,可以使用 @Validated 注解并指定分组。例如,当需要对创建操作进行校验时,指定 CreateGroup 分组。
@PostMapping("/create")
public ResponseEntity<String> createUser(@Validated(User.CreateGroup.class) @RequestBody User user) {// 业务逻辑return ResponseEntity.ok("User created successfully");
}@PutMapping("/update")
public ResponseEntity<String> updateUser(@Validated(User.UpdateGroup.class) @RequestBody User user) {// 业务逻辑return ResponseEntity.ok("User updated successfully");
}
在上述示例中,createUser 方法中指定了 User.CreateGroup 分组,这意味着该请求只会对属于 CreateGroup 的校验项进行验证,而忽略其他分组的校验项。类似地,updateUser 方法则只会校验 UpdateGroup 中的校验项。
3.4 默认分组和分组的继承
如果校验注解中未指定 groups 属性,那么该校验项默认属于 Default 分组,即在未指定分组时会自动执行此类校验。Spring中所有的校验注解默认属于 Default 分组,这样在大多数场景下可以直接使用 @Valid 进行校验。
此外,分组还可以通过继承的方式进行组合。在复杂的校验场景下,可以通过继承来定义具有层级结构的分组。例如,我们可以让 CreateGroup 继承自 Default 分组,从而在执行 CreateGroup 校验时包含所有 Default 校验项。
public interface Default {}
public interface CreateGroup extends Default {}
这样,CreateGroup 中的校验项不仅包括 CreateGroup 自身的校验规则,还会涵盖 Default 分组中的校验规则。
4. 分组校验的优势和适用场景
分组校验的优势在于其灵活性和针对性,能够有效减少冗余代码,适应复杂的校验需求。
4.1 优势
- 提高代码的灵活性:分组校验使得开发者可以在不同的场景中指定不同的校验规则,减少重复定义的校验代码。
- 满足多场景的校验需求:在新增、修改、删除等不同场景下,允许使用不同的校验逻辑,以适应不同的业务需求。
- 便于代码的管理和维护:分组校验逻辑清晰,方便团队合作和代码维护。
4.2 适用场景
- 不同操作场景:如新增和更新操作对字段有不同的要求,可以通过分组校验来实现不同的规则。
- 复合场景校验:在复杂业务逻辑中,需要对不同操作组合进行校验的场景。
- 模块化校验:在表单或数据传输较多时,可以通过分组将相似的数据校验集中管理。
5. 常见问题与解决方案
5.1 校验未生效
如果校验未生效,通常可能是因为未在控制层方法中使用 @Validated 注解或未指定正确的分组。确保校验方法中正确地使用了 @Validated 并传入了分组信息。
5.2 无法识别默认分组
在使用 Default 分组时,务必注意 groups 属性的配置。若未指定 groups,默认分组会自动包含所有校验项;而一旦明确指定分组,则只会校验指定的分组项。
结语
分组校验是Spring框架中一个实用而灵活的校验机制,它通过将校验项进行分组,使得不同场景的校验需求得以有效满足。分组校验不仅提高了代码的复用性和灵活性,还极大地降低了开发和维护的复杂度。通过合理应用分组校验,可以让数据校验更加简洁、直观、符合业务需求。希望本文的详细讲解能帮助您在实际开发中灵活应用分组校验,实现高效的数据验证。
相关文章:
分组校验在Spring中的应用详解
目录 前言1. 什么是分组校验2. 分组校验的基本原理3. 分组校验的实现步骤3.1 定义分组接口3.2 在校验项中指定分组3.3 校验时指定要校验的分组3.4 默认分组和分组的继承 4. 分组校验的优势和适用场景4.1 优势4.2 适用场景 5. 常见问题与解决方案5.1 校验未生效5.2 无法识别默认…...
torch.nn.**和torch.nn.functional.**的区别
torch.nn.** torch.nn.**是一个继承了torch.nn.Module的类,使用前必须先构造对象,然后再调用。如果直接使用则会报错 例如 a torch.randn(3,4) print(a) sigmoid torch.nn.Sigmoid() a sigmoid(a) print(a) a torch.nn.Sigmoid(a)tensor([[ 0.2462…...
Air780E基于LuatOS编程开发
Air780E基于LuatOS编程开发 Air780E开发板下载固件版本开发板刷机开发调试源码编译下载源码编译工具编译工具链 Air780E开发板 合宙通信推出的 LTE Cat.1 bis通信模块,采用移芯EC618平台,支持4G全网通, 包括的模组有: Air780E – 4G Cat.1Air780EG – …...
贪心算法-汽车加油
这道题目描述了一个汽车旅行场景,需要设计一个有效的算法来决定在哪几个加油站停车加油,以便最小化加油次数。题目给出了汽车加满油后的行驶距离n公里,以及沿途若干个加油站的位置。我们需要找出一个方案,使得汽车能够完成整个旅程…...
Qt信号和槽-->day04
Qt信号和槽 标准的信号和槽函数Qt中的槽函数Qt中的信号 connect案例 自定义信号和槽案例分析 信号槽的拓展信号连接信号案例 信号槽的两种连接方式Qt5中的处理方式Qt4中的处理方式Qt5处理信号槽重载问题案例 lambda表达式简单案例Qt中的应用 补充知识点 标准的信号和槽函数 QW…...
【Linux】为终端命令自定义快件键并弹窗提醒 设置快捷键切换网络代理(Network Proxy)Disabled/Manual 并弹窗提醒
【Linux】为终端命令自定义快件键并弹窗提醒 设置快捷键切换网络代理(Network Proxy)Disabled/Manual 并弹窗提醒 可以自定义快捷键执行终端命令,执行完毕会有弹窗提醒。下面给一个例子,设置快捷键切换网络代理(Netwo…...
十六:Spring Boot依赖 (1)-- spring-boot-starter 依赖详解
1. 简介: spring-boot-starter 是 Spring Boot 项目中的基础启动器依赖,它为开发者提供了 Spring Boot 应用所需的核心功能和自动配置 spring-boot-starter 不是一个具体的功能模块,而是一个基础的启动器。 Spring Boot 提供了一系列的 sta…...
讲讲关于SNMP与智能PDU插座
什么是SNMP 简单网络管理协议 (SNMP) 是一种应用层协议,主要用于网络管理中的设备监控和控制。通过 SNMP,网络管理员可以从管理站远程访问网络中的设备,获取设备的状态信息、配置参数,甚至控制设备的行为。SNMP 被广泛应用于 TCP/…...
在CentOS下安装RabbitMQ
在CentOS下安装RabbitMQ 在CentOS下安装RabbitMQ可以按照以下步骤进行:步骤 1: 更新系统步骤 2: 安装Erlang步骤 3: 添加RabbitMQ仓库步骤 4: 安装RabbitMQ步骤 5: 启动RabbitMQ服务步骤 6: 检查RabbitMQ状态步骤 7: 启用RabbitMQ管理插件(可选ÿ…...
前端使用Canvas实现网页电子签名(兼容移动端和PC端)
实现效果: 要使用Canvas实现移动端网页电子签名,可以按照以下步骤: 在HTML文件中创建一个Canvas元素,并设置其宽度和高度,以适配移动设备的屏幕大小。 // 创建一个canvas元素 let canvas document.createElement(&q…...
什么是OSTRPT报文?
OSTRPT(Order Status Report)是一种 EDI(电子数据交换)报文,用于在供应链管理中向采购商报告订单状态。这种报文通常由供应商发送给采购商,目的是告知订单的当前处理状态、预期交货时间、订单中的变化等信息…...
PICO+Unity MR空间锚点
官方链接:空间锚点 | PICO 开发者平台 注意:该功能只能打包成APK在PICO 4 Ultra上真机运行,无法通过串流或PICO developer center在PC上运行。使用之前要开启视频透视。 在 Inspector 窗口中的 PXR_Manager (Script) 面板上,勾选…...
electron 中 contextBridge 作用
1. 安全地实现渲染进程和主进程之间的通信 在 Electron 应用中,主进程和渲染进程是相互隔离的,这是为了安全和稳定性考虑。 然而,在很多情况下,渲染进程需要访问主进程中的某些功能,例如系统级别的操作或者一些应用级…...
15分钟学 Go 第 42 天:RESTful API设计
第42天:RESTful API设计 目标:理解RESTful API的设计原则 在现代Web开发中,RESTful API(Representational State Transfer)已经成为了标准的架构风格,用于实现客户端与服务器之间的通信。通过遵循REST的设…...
如何安全的中断一个运行中的线程?
文心快码进入3.0时代, 最新发布的代码问答、编码、Debug、单测、安全智能体, 分别在开发的设计、编码、构建、测试验证全流程通过AI赋能,让效率更高、效果更好。可以通过自然语言对话,独立为你完成一项编码任务。 👉点…...
【121. 买卖股票的最佳时机】——贪心算法/动态规划
121. 买卖股票的最佳时机 一、题目难度 简单 三、题目描述 给定一个数组 prices,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获…...
LLMs之Calculate:利用大语言模型技术基于文本内容实现数字计算能力的简介、常用方法、代码实现之详细攻略
LLMs之Calculate:利用大语言模型技术基于文本内容实现数字计算能力的简介、常用方法、代码实现之详细攻略 导读:在基于大语言模型(LLM)技术实现数字计算能力的背景下,文本内容的理解和计算过程涉及多个领域的交叉技术,包括自然语言处理(NLP)、机器学习、以及数值计算。…...
LeetCode题练习与总结:判断子序列--392
一、题目描述 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一…...
json数据结构的转换
# json可用于赌徒与原件数据的转换(json以字符串的形式储存数据,在通过json进行两种语言的转换时,应先将数据类型转换成列表或字典,再由列表或字典转换成json字符串,最后由json字符串转换成另一种语言的列表或字典数据…...
mysql删除语句:@Update(“TRUNCATE TABLE employee“)讲解
这个 SQL 语句: TRUNCATE TABLE employee是一个 SQL DDL(数据定义语言) 操作,用于清空数据库表中的所有记录,但不会删除表结构(即列和索引等)。 逐部分解释: TRUNCATE:…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
