springboot实战(16)(Validation参数校验冲突问题、分组校验、默认分组)

目录

一、注解@NotNull与@NotEmpty区别。

二、Validation提供的分组校验。(参数校验冲突问题)

(1)基本介绍。

(2)实际案例。

(3)大模型提问提供的方法。

1、定义分组接口。

2、在字段上指定分组。

3、在方法上指定分组。

(4)本人使用的方法。

1、Validation中表示分组——使用接口表示。

2、指定校验项的归属分组。

3、校验时——指定要校验的分组。

4、操作演示。

三、Validation提供的默认分组。

(1)基本介绍。

(2)操作演示。

(3)分组校验的注意事项!


一、注解@NotNull与@NotEmpty区别。
  • @NotNull代表:不能不进行传值
  • @NotEmpty代表:不能不进行传值,且如果是字符串,不能传空字符串(如"")。

二、Validation提供的分组校验。(参数校验冲突问题)
(1)基本介绍。
  • 在使用Spring的Validation进行参数校验时,如果遇到对同一个实体参数进行校验时出现冲突问题,通常是因为不同的业务场景对同一个字段的校验规则不同。

(2)实际案例。
  • 如下案例:添加文章分类功能与更新文章分类功能。它们通过相同的路径映射,但不同的请求方式进行不同的操作。
  • 在更新文章分类时,对于获取前端(传的文章的id)参数要求必须有的(@NotNull)。但对于添加文章分类时,文章id是主键,在数据库自增创建,所以不是必须的,就会出现冲突。

  • 实体类。

  • 添加文章分类。

  • 更新文章分类。

  • 添加文章分类测试(报错)


(3)大模型提问提供的方法。
1、定义分组接口。
  • 在实体类中定义不同的接口来表示不同的校验分组
  • 例如,对于用户实体类,可以定义添加用户和更新用户的分组。
public class User {
    public interface Add extends Default {}
    public interface Update extends Default {}
}
2、在字段上指定分组。
  • 在实体类的字段上使用校验注解时,通过groups属性指定该字段属于哪个分组
@NotNull(groups = Update.class)
private Integer id;
3、在方法上指定分组。
  • 在校验的方法参数上,通过@Validated注解指定具体的分组。这样只有属于该分组的校验规则会被应用。
  • 这样添加用户、更新用户的参数校验就不会出现冲突的问题。

  • 添加用户。
@PostMapping
public Result add(@RequestBody @Validated(User.Add.class) User user){
    return Result.success();
}
  • 更新用户。

@PutMapping
public Result update(@RequestBody @Validated(User.Update.class) User user){
    return Result.success();
}
  • 通过上述步骤,可以针对同一个实体类在不同的业务场景下应用不同的校验规则,从而解决校验冲突的问题。


(4)本人使用的方法。
  • Validation提供的分组校验的基本介绍。

  • 使用分组校验需要做的事情。


1、Validation中表示分组——使用接口表示。
  • 定义一个接口就代表一个分组。当前需求是两组,只需要在对应的实体类(Category:文章类)定义两个内部接口(Add:新增组、Update:更新组)
2、指定校验项的归属分组。
  • Validation提供的校验注解里,都有一个属性:"groups"。
  • 可以通过"groups"属性来指定当前校验项属于哪个分组
  • 注意"groups"属性的类型是一个数组可以给同一个校验项去指定多个分组指定多个组时记得使用"{}"


3、校验时——指定要校验的分组。
  • 注解@Validated(?)。其中"?"填写是与校验的接口相对于。
  • 在更新方法中,需要校验的是更新传的参数,就往里面插入xxx.Update.class就行。
  • 在新增方法中,需要校验的是新增传的参数,就往里面插入xxx.Add.class就行。

4、操作演示。
  • 定义接口(创建两个分组)

  • 定义校验项时指定其对应归属分组。

  • 校验时——指定其要校验分组。



  • 测试结果。
  • 添加文章分类。


  • 更新文章分类。



  • 问题:回到实体类。如果同一个校验项有多个分组,则Validation提供的注解的"groups"属性需要写多个校验项,是不是很麻烦?
三、Validation提供的默认分组。
(1)基本介绍。
  • 如果某个校验项没有指定分组。则默认属于Default分组
  • 每个分组之前可以继承!A extends B,那么A中拥有B中所有的校验项。

(2)操作演示。
  • 因为"文章分类名称"与"文章分类别名"两个字段:对于新增文章分类、更新文章分类两个功能都需要设置成@NotEmpty。
  • 所以就都让它们各自的分组去继承Default分组。这样就不需要在"groups"属性进行指定分组类型。
  • 注意继承时,需要导入对应的包!否则失效!
import jakarta.validation.groups.Default;



  • 重新启动工程测试。
  • 新增。



  • 更新。


  • 这样就使用Validation提供的默认分组对当前的代码进行优化了。
(3)分组校验的注意事项!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/922447.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学Linux的第九天--磁盘管理

目录 一、磁盘简介 (一)、认知磁盘 (1)结构 (2)物理设备的命名规则 (二)、磁盘分区方式 MBR分区 MBR分区类型 扩展 GPT格式 lsblk命令 使用fdisk管理分区 使用gdisk管理分…

【ubuntu+win】Win10+Ubuntu22.04双系统给ubuntu系统中的某个分区进行扩容(从400G->800G)数据无损坏

给ubuntu已分区的部分进行扩容 1. 准备扩容的空间2.进入ubuntu系统进行卸载分区3.安装图形界面的安装包4.进行对分区扩容5. 重新挂载 我的情况是这式的(可以不看,直接看后面的): 刚开始买下电脑的时候,只装了一个 1T 的…

流式上传与分片上传的原理与实现

🚀 博主介绍:大家好,我是无休居士!一枚任职于一线Top3互联网大厂的Java开发工程师! 🚀 🌟 在这里,你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人,我不仅热衷…

Ettus USRP X410

总线连接器: 以太网 RF频率范围: 1 MHz 至 7.2 GHz GPSDO: 是 输出通道数量: 4 RF收发仪瞬时带宽: 400 MHz 输入通道数量: 4 FPGA: Zynq US RFSoC (ZU28DR) 1 MHz to 7.2 GHz,400 MHz带宽,GPS驯服OCXO,USRP软件无线电设备 Ettus USRP X410集…

oracle 19c RAC到单机ogg部署安装

源端(RAC)目标端(FS)IP192.168.40.30/31192.168.40.50数据库版本Oracle 19.3.0Oracle 19.3.0主机名hfdb30/hfdb31hfogg操作系统REHL7.6REHL7.6数据库实例hfdb1/hfdb2hfogg同步用户hfdb1hfdb1同步表testtestOGG版本19.1.0.0.419.1.…

现代密码学

概论 计算机安全的最核心三个关键目标(指标)/为:保密性 Confidentiality、完整性 Integrity、可用性 Availability ,三者称为 CIA三元组 数据保密性:确保隐私或是秘密信息不向非授权者泄漏,也不被非授权者使…

QT QGridLayout控件 全面详解

本系列文章全面的介绍了QT中的57种控件的使用方法以及示例,包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizonta…

Adobe Illustrator 2024 安装教程与下载分享

介绍一下 下载直接看文章末尾 Adobe Illustrator 是一款由Adobe Systems开发的矢量图形编辑软件。它广泛应用于创建和编辑矢量图形、插图、徽标、图标、排版和广告等领域。以下是Adobe Illustrator的一些主要特点和功能: 矢量绘图:Illustrator使用矢量…

IDEA2023设置控制台日志输出到本地文件

1、Run->Edit Configurations 2、选择要输出日志的日志,右侧,IDEA2023的Logs在 Modify option 里 选中就会展示Logs栏。注意一定要先把这个日志文件创建出来,不然不会自动创建日志文件的 IDEA以前版本的Logs会直接展示出来 3、但是…

[UE5学习] 一、使用源代码安装UE5.4

一、简介 本文介绍了如何使用源代码安装编译UE5.4,并且新建简单的项目,打包成安卓平台下的apk安装包。 二、使用源代码安装UE5.4 注意事项: 请保证可以全程流畅地科学上网。请保证C盘具有充足的空间。请保证接下来安装下载的visual studi…

细说敏捷:敏捷四会之standup meeting

上一篇文章中,我们讨论了 敏捷四会 中 冲刺计划会 的实施要点,本篇我们继续分享敏捷四会中实施最频繁,团队最容易实施但往往也最容易走形的第二个会议:每日站会 关于每日站会的误区 站会是一个比较有标志性的仪式活动&#xff0…

10M和100M网口的编码及EMC影响

10M网口编码技术 10M网口,即10Base-T,采用的是曼彻斯特编码方法 。在这种编码中,“0”由“”跳变到“-”,而“1”由“-”跳变到“” 。这种编码方式的特点是信号的DC平衡,即信号在任何一段时间内的平均电压为零&#…

docker基本使用

参考视频: 参考视频https://www.bilibili.com/video/BV1e64y1F7pJ/?share_sourcecopy_web&vd_source8fc0c76c477d3db71f89fa5ae5b258c7 docker容器操作: 拉取镜像: 拉取官网ubuntu镜像 sudo docker pull ubuntu 运行镜像:…

音频信号采集前端电路分析

音频信号采集前端电路 一、实验要求 要求设计一个声音采集系统 信号幅度:0.1mVpp到1Vpp 信号频率:100Hz到16KHz 搭建一个带通滤波器,滤除高频和低频部分 ADC采用套件中的AD7920,转换率设定为96Ksps ;96*161536 …

构建高效在线教育:SpringBoot课程管理系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理在线课程管理系统的相关信息成为必然。开发…

【云计算网络安全】解析 Amazon 安全服务:构建纵深防御设计最佳实践

文章目录 一、前言二、什么是“纵深安全防御”?三、为什么有必要采用纵深安全防御策略?四、以亚马逊云科技为案例了解纵深安全防御策略设计4.1 原始设计缺少安全策略4.2 外界围栏构建安全边界4.3 访问层安全设计4.4 实例层安全设计4.5 数据层安全设计4.6…

基于LiteFlow的风控系统指标版本控制

个人博客:无奈何杨(wnhyang) 个人语雀:wnhyang 共享语雀:在线知识共享 Github:wnhyang - Overview 更新日志 最近关于https://github.com/wnhyang/coolGuard此项目更新了如下内容:https://g…

Spring:AOP切入点表达式

对于AOP中切入点表达式,我们总共会学习三个内容,分别是语法格式、通配符和书写技巧。 语法格式 首先我们先要明确两个概念: 切入点:要进行增强的方法切入点表达式:要进行增强的方法的描述方式 对于切入点的描述,我们其实是有两中方式的&a…

docker搭建私有的仓库

docker搭建私有仓库 一、为什么要搭建私有的仓库? 因为在国内,访问:https://hub.docker.com/ 会出现无法访问页面。。。。(已经使用了魔法) 当然现在也有一些国内的镜像管理网站,比如网易云镜像服务、Dao…

大白话讲Promise(最详细)

学前端的大家都知道promise是重中之重,也是面试的必考项。但是刚接触promise我一直很晕头晕脑的,搜集文章前看后看基本都是讲解promise的状态它的方法就没有再深入了,以至于面试时候面试官一旦往深问我就懵了。所以今天我们就详细的说一下pro…