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

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)分组校验的注意事项!


http://www.kler.cn/a/408175.html

相关文章:

  • 【AI日记】24.11.24 学习谷歌数据分析初级课程-第5课
  • 离散数学【关系】中的一些特殊关系
  • Python浪漫之画明亮的月亮
  • 医学AI公开课·第一期|Machine LearningTransformers in Med AI
  • 「Mac玩转仓颉内测版30」基础篇10 - 区间类型详解
  • (十一)Python字符串常用操作
  • opencv进行rtsp推流
  • Python 将彩色视频转换为黑白视频(MP4-格式可选)
  • luckfox_pico_yolov5
  • AT_abc380
  • 游戏引擎学习第22天
  • Midjourney以图生图攻略,6个案例以学代练
  • 图文检索(27):Generalising Fine-Grained Sketch-Based Image Retrieval
  • (四)3D视觉机器人的手眼标定(眼在手外)
  • 16. 清理Python包管理工具(pip 和 conda)的缓存和冗余文件
  • 2024年 数模美赛 D题 湖流网络水位控制
  • Qt如何屏蔽工具栏(QToolBar)自动折叠功能
  • 嵌入式软件工程师岗位细分全景图
  • 嵌入式开发工程师面试题 - 2024/11/24
  • MATLAB的addpath和rmpath函数增加或删除路径
  • flink学习(6)——自定义source和kafka
  • CCF认证202406-02 | 矩阵重塑(其二)
  • 计算机网络socket编程(6)_TCP实网络编程现 Command_server
  • node报错:cb.apply is not a function
  • 附录 9A 计量经济学实验室#5
  • 二号交叉学科楼的英文表达是什么?No. 2 Interdisciplinary Research Building