SpringBoot中@Validated或@Valid注解校验的使用
文章目录
- SpringBoot中@Validated或@Valid注解校验的使用
- 1. 添加依赖
- 2. 使用示例准备
- 2-1 测试示例用到的类
- 2-2 实体Dto,加入校验注解
- 2-2 Controller
- 3. 示例测试
- 4. @Valid 和 @Validated注解详解
- 4-1 常用规则注解
- 4-2 分组验证
- 4-2-1 示例准备
- 4-2-2 Controller接口
- 4-2-3 PostMan测试
- 4-3 嵌套校验
- 4-3-1 示例【复杂对象嵌套校验】
SpringBoot中@Validated或@Valid注解校验的使用
1. 添加依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2. 使用示例准备
2-1 测试示例用到的类
@AllArgsConstructor
@Data
public class ResponseDto<T> {private int code;private String message;private T data;
}
public class ResponseUtil {public static <T> ResponseDto success(T data){return new ResponseDto(200,"success",data);}public static <T> ResponseDto fail(T data){return new ResponseDto(1,"fail",data);}
}
/*** 全局异常处理类*/
@Slf4j
@ResponseBody
@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(value = Exception.class)private ResponseDto handlerParameterCheckException(Exception e) {return ResponseUtil.fail(e.toString());}}
2-2 实体Dto,加入校验注解
// @NotNull表示参数不能为空
// @Min表示数值的最小值
// @Max表示数值的最大值
// message属性用来设置验证失败的提示信息
@Data
public class UserInfoDto {@NotNull(message = "用户姓名不能为空")private String userName;@NotNull(message = "年龄不能为空")@Min(value = 18,message = "年龄不能小于18")@Max(value = 100,message = "年龄不能超过100")private Integer age;
}
2-2 Controller
@RestController
@RequestMapping("/Api/v1.0")
public class Demo1Controller {@PostMapping("/user")public ResponseDto validUserInfo(@Validated @RequestBody UserInfoDto param){return ResponseUtil.success(param);}
}
3. 示例测试
使用PostMan发起请求
4. @Valid 和 @Validated注解详解
4-1 常用规则注解
下面表格列出常用校验类及主要功能。
这些注解必须配合@Valid或@Validated使用,通过这两个注解开启校验
注 :
对于长度的校验基本都支持字符串、集合、Map、数组的长度。
下面是@Valid和@Validated的区别。
// 注 :嵌套验证。
// JavaBean A中某个属性, 其类型是JavaBean B,对A进行验证的同时验证B。
相同点:
- @Valid 和 @Validated 两者都可以对数据进行校验,在校验字段上加上规则注解(@NotNull,
@NotEmpty等)都可以对 @Valid 和 @Validated 生效。 - @Valid 和 @Validated 两者都可以与BindingResult bindingResult配对出现,
并且形参顺序是固定的(一前一后),controller对BindingResult处理返回校验提示。 - @Valid 和 @Validated 两者也可以单独使用,单独使用当校验不通过时会抛出
BindException异常。这时需要再写一个全局校验异常捕获处理类,然后返回校验提示。
不同点
- @Valid可以用在方法、构造函数、方法参数和成员属性(field)上;
- @Valid可以进行嵌套校验,但是,需要在嵌套的字段上面加上@Valid注解; @Valid不支持分组。
- @Validated可以用在方法、构造函数、方法参数;但是不能用在成员属性(字段)上;
- @Validated不支持嵌套校验,因为不能用在成员属性(字段)上;
- @Validated支持分组验证,以在入参验证时,根据不同的分组采用不同的验证机制;
4-2 分组验证
4-2-1 示例准备
/*** 成年人*/
public interface Adult {
}/*** 未成年人*/
public interface Juveniles {
}
// 提示
// 主要的修改是在校验注解中添加了groups属性,用来指定当前的校验针对哪一个组。
// @Max(value = 100,message = "年龄不能超过100",groups = Adult.class)和
// @Min(value = 18,message = "年龄不能小于18",groups = Adult.class)
// 指定了成年人用户信息的年龄属性验证规则。
// @Max(value = 17,message = "年龄不能大于17岁",groups = Juveniles.class)
// 指定了未成年人用户信息的年龄要小于18岁。@Data
public class UserInfoDTO {@NotNull(message = "用户姓名不能为空")private String userName;@NotNull(message = "年龄不能为空")@Min(value = 18,message = "年龄不能小于18",groups = Adult.class)@Max(value = 100,message = "年龄不能超过100",groups = Adult.class)@Max(value = 17,message = "年龄不能大于17岁",groups = Juveniles.class)private Integer age;
}
4-2-2 Controller接口
/*** 成年人 --> @Validated(value = Adult.class):仅校验成年人,即有groups = Adult.class的属性* @param param* @return*/
@PostMapping("/userAdult")
public UserInfoDTO validUserAdult(@Validated(value = Adult.class) @RequestBody UserInfoDTO param){return param;
}/*** 未成年人 --> @Validated(value = Adult.class):仅校验未成年人,即有groups = Juveniles.class的属性* @param param* @return*/
@PostMapping("/userJuveniles")
public UserInfoDTO validUserJuveniles(@Validated(value = Juveniles.class) @RequestBody UserInfoDTO param){return param;
}
4-2-3 PostMan测试
4-3 嵌套校验
// 1. @Validated无法单独提供嵌套验证功能。
// 不能用在成员属性上,
// 能配合嵌套验证注解@Valid进行嵌套验证
// 2. 在嵌套对象字段上加上@Valid注解,如:
public class User {@Validprivate Address address;
}
4-3-1 示例【复杂对象嵌套校验】
@Data
public class Object1 {@Length(max = 50,message = "长度不能超过50位字符")@NotBlank(message = "名称不能为空")private String name;@NotNull(message = "不能为空")private Integer grade;@NotNull(message = "计分展示不能为空")private Integer scoreDimension;@NotNull(message = "obj2s不能为空")/*** 嵌套验证时必须使用 @Valid注解*/@Validprivate List<Object2> obj2s;
}@Data
public class Object2{@Length(max = 50, message = "长度不能超过50位字符")@NotBlank(message = "分类名称不能为空")private String categoryName;/*** 嵌套验证时必须使用 @Valid注解*/@Validprivate List<Object3> obj3s;
}@Data
public class Object3{@NotNull(message = "分值不能为空")@Max(value =1000 , message = "分值最大不能超过1000")private Integer score;@Size(max = 500, message = "最多可输入500个字符")private String standards;@Size(max = 10, message = "标最多10条")private String[] urls;@NotNull(message = "不能为空")private Integer[] rating;
}//controller校验@PostMapping("/check")public Result<Void> check( @Validated @RequestBody Object1 obj1) {return servei1.check(obj1);}
相关文章:

SpringBoot中@Validated或@Valid注解校验的使用
文章目录 SpringBoot中Validated或Valid注解校验的使用1. 添加依赖2. 使用示例准备2-1 测试示例用到的类2-2 实体Dto,加入校验注解2-2 Controller 3. 示例测试4. Valid 和 Validated注解详解4-1 常用规则注解4-2 分组验证4-2-1 示例准备4-2-2 Controller接口4-2-3 P…...

HashMap为什么线程不安全?
一、Put操作(数据覆盖) HashMap底层是基于数组 链表(在 Java 8 以后,当链表长度超过一定阈值时会转换为红黑树)的数据结构。在多线程环境下,当多个线程同时对HashMap进行put操作时,可下面这种…...
类加载器及反射
目录 1.类加载器 1.1类加载【理解】 1.2类加载器【理解】 1.2.1类加载器的作用 1.2.2JVM的类加载机制 1.2.3Java中的内置类加载器 1.2.4ClassLoader 中的两个方法 2.反射 2.1反射的概述【理解】 2.2获取Class类对象的三种方式【应用】 2.2.1三种方式分类 2.2.2示例…...
aws boto3 下载文件
起因:有下载 aws s3 需求,但只有web 登录账号,有 id 用户名 密码,没有 boto3 的 key ID 经过分析,发现网页版有个地址会返回临时 keyID,playwright 模拟登录,用 page.on 监测返回数据ÿ…...

3DDFA-V3——基于人脸分割几何信息指导下的三维人脸重建
1. 研究背景 从二维图像中重建三维人脸是计算机视觉研究的一项关键任务。在虚拟现实、医疗美容、计算机生成图像等领域中,研究人员通常依赖三维可变形模型(3DMM)进行人脸重建,以定位面部特征和捕捉表情。然而,现有的方…...
求串长(不使用任何字符串库函数)
问题描述 编写一个程序,输入一个字符串,输出串的长度。 要求: (1)字符串长度不超过100个字符。 (2)不使用任何字符串库函数,建议使用堆串存储结构。 输入描述 输入一个字符串。 …...

第02章 MySQL环境搭建
一、MySQL的卸载 如果安装mysql时出现问题,则需要将mysql卸载干净再重新安装。如果卸载不干净,仍然会报错安装不成功。 步骤1:停止MySQL服务 在卸载之前,先停止MySQL8.0的服务。按键盘上的“Ctrl Alt Delete”组合键࿰…...

linux系统编程 man查看manual.stat
获取文件属性,(从inode结构体中获取) stat/lstat 函数 int stat(const char *path, struct stat *buf); 参数: path: 文件路径 buf:(传出参数) 存放文件属性,inode结构体…...
从网络到缓存:在Android中高效管理图片加载
文章目录 在Android应用中实现图片缓存和下载项目结构使用 代码解析关键功能解析1. 图片加载方法2. 下载图片3. 保存图片到缓存4. 文件名提取 总结 首先我们需要在配置AndroidManifest.xml里面添加 <uses-permission android:name"android.permission.INTERNET" …...
【数据结构】链表详解:数据节点的链接原理
链表(Linked List)是一种基础的数据结构,是程序设计中用来存储数据的典型方法之一。链表特别适合插入和删除操作频繁的场景,是了解数据结构和算法的基础。本文将从零开始,带大家了解链表的底层原理、类型(单…...
使用AWS Redshift从AWS MSK中读取数据
Amazon Redshift 流式摄取的目的是简化将流式数据直接从流式服务摄取到 Amazon Redshift 或 Amazon Redshift Serverless 的过程。 官方文档[1]中有详细步骤。用unauthenticated, IAM 的方式均可以进行连接,只不过使用的是不同端口:9092或者9098 [1] h…...
从0开始学统计-数据类别与测量层次
数据分析前,我们首先要弄清楚数据的分类。数据并不仅仅是一堆数字和文字,它们实际上代表了我们看待事物属性的不同视角。从最宽泛的角度出发,我们可以将数据划分为定量(比如用数字表示)或者定性(例如&#…...

使用AIM对SAP PO核心指标的自动化巡检监控
一、背景 由于SAP PO系统维护成本较高,各类型异常报错等都需要人员进行时刻监控和响应,遂由AIM平台进行自动化巡检SAP PO的各指标,然后告警通知用户,节省维护成本和提高工作效率 二、核心指标监控 SAP PO失败消息 适用于S…...
C++——unordered_map和unordered_set的封装
unordered_map和unordered_set的底层结构用到的都是在哈希表模拟实现中的哈希桶的实现方式,哈希桶的具体实现我已经在哈希表的模拟实现里做过详细的介绍,这边会引用里面的代码进行改造和封装,同时为了方便操作,同样我采用二倍扩容…...

微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖、z-index应用及性能分析
微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖、z-index应用及性能分析 目录 微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖、z-index应用及性能分析 1、iOS在scroll-view内部上下滑动吸顶的现象 正常的上下滑动吸顶…...
【高中数学】数列
等差数列前 n n n 项和性质 公式一: S n n ( a 1 a n ) 2 S_n\frac{n(a_1a_n)}{2} Sn2n(a1an) 公式二: S n n a 1 n ( n − 1 ) 2 d S_nna_1\frac{n(n-1)}{2}d Snna12n(n−1)d 性质1:等差数列中依次 k k k 项之和 S …...

数字媒体技术基础:AMF(ACES 元数据文件 )
在现代电影和电视制作中,色彩管理变得越来越重要。ACES(Academy Color Encoding System,美国电影艺术与科学学院颜色编码系统)是一个广泛采用的色彩管理和交换系统,旨在解决不同设备、软件和工作流程之间的色彩不一致问…...

Apache Dubbo (RPC框架)
本文参考官方文档:Apache Dubbo 1. Dubbo 简介与核心功能 Apache Dubbo 是一个高性能、轻量级的开源Java RPC框架,用于快速开发高性能的服务。它提供了服务的注册、发现、调用、监控等核心功能,以及负载均衡、流量控制、服务降级等高级功能。…...
LeetCode 3226. 使两个整数相等的位更改次数
. - 力扣(LeetCode) 题目 给你两个正整数 n 和 k。你可以选择 n 的 二进制表示 中任意一个值为 1 的位,并将其改为 0。 返回使得 n 等于 k 所需要的更改次数。如果无法实现,返回 -1。 示例 1: 输入: n …...

面试经典 150 题:189、383
189. 轮转数组 【参考代码】 class Solution { public:void rotate(vector<int>& nums, int k) {int size nums.size();if(1 size){return;}vector<int> temp(size);//k k % size;for(int i0; i<size; i){temp[(i k) % size] nums[i];}nums temp; }…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...