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);}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS使用arkTS拉起指定第三方应用程序

HarmonyOS使用arkTS拉起指定第三方应用程序 前言代码及说明bundleName获取abilityName获取 前言 本篇只说采用startAbility方式拉起第三方应用&#xff0c;需要用到两个必备的参数bundleName&#xff0c;abilityName&#xff0c;本篇就介绍如何获取参数… 代码及说明 bundle…

04_CC2530+Uart串口通信

04_CC2530UART串口通信 串口通信基本概念 串行通信: 数据字节一位位地依次传送的通信方式, 串行通信的速度慢, 但用的传输线条数少, 成本低&#xff0c;适用于远距离的数据传送并行通信: 数据字节的各位同事传送的通信方式, 优点是数据传送速度快, 缺点是占用的传输线条数多,…

Speaker Recognition说话人识别(声纹识别)

说话人识别&#xff0c;又称声纹识别。从上世纪60年代开始到现在&#xff0c;声纹识别一直是生物识别技术研究的主题。从传统的基于模板匹配的方法&#xff0c;到早期基于统计学方法&#xff0c;直到基于深度学习的声纹识别技术成为主流。本项目给出一个从传统&#xff08;基于…

SpringBoot篇(简化操作的原理)

目录 一、代码位置 二、统一版本管理&#xff08;parent&#xff09; 三、提供 starter简化 Maven 配置 四、自动配置 Spring&#xff08;引导类&#xff09; 五、嵌入式 servlet 容器 一、代码位置 二、统一版本管理&#xff08;parent&#xff09; SpringBoot项目都会继…

华为HarmonyOS借助AR引擎帮助应用实现虚拟与现实交互的能力3-获取设备位姿

设备位姿描述了物体在真实世界中的位置和朝向。AR Engine提供了世界坐标下6自由度&#xff08;6DoF&#xff09;的位姿计算&#xff0c;包括物体的位置&#xff08;沿x、y、z轴方向位移&#xff09;和朝向&#xff08;绕x、y、z轴旋转&#xff09;。通过AR Engine&#xff0c;您…

【Git】Git常用命令

目录 1 前言2 git命令2.1 branch2.2 checkout2.3 pull and push2.4 config2.4.1 Proxy 2.5 tag2.6 rebase2.7 patch2.8 remote2.9 submodule2.10 rm2.10 gitignore2.11 某个commit更改了哪些文件2.12 clean 3 结束语 1 前言 本章记录总结在使用git过程中常用的一些命令&#x…

cgroup2版本下使用cgroups对内存/cpu进行控制

先查看cgroups的版本支持: cat /proc/filesystems | grep cgroup 运行结果: 如上表示支持cgroup2版本 一、对内存进行控制 cgroup版本对于内存控制是单独使用/sys/fs/cgroup/memory路径控制的,而在cgroup2版本中是统一管理,所以没有该路径,所以只需先进入该路径: cd /sys/…

安卓应用跳转回流的统一和复用

本文字数&#xff1a;6799字 预计阅读时间&#xff1a;35分钟 作为一个功能复杂的应用&#xff0c;无法避免地需要支持众多路径的回流&#xff0c;比如从Launcher、从Push通知、从端外H5、从合作第三方App以及从系统资源分享组件等。 我们知道&#xff0c;不同的回流路径会通过…

C3.【C++ Cont】名字空间、注释和变量

目录 1.回顾 2.名字空间(也称命名空间) 介绍 代码示例 3.注释 4.练习 B2003 输出第二个整数 方法1 方法2 1.回顾 在C1.【C Cont】准备中提到了名字空间(namespace)语句 using namespace std; 2.名字空间(也称命名空间) 介绍 1.处在在同一个空间内的,若有重名则会名…

常见自动化测试框架分层架构

作为一名专业的测试人员&#xff0c;搭建一个高级的自动化测试框架需要考虑多个因素。以下是一些步骤和指导&#xff0c;帮助你构建一个强大且灵活的自动化测试框架&#xff1a; 1. 理解框架的概念&#xff1a; - 首先&#xff0c;我们需要明确什么是“框架”。在自动化测试中…

103 - Lecture 2 Table and Data Part 1

SQL - Tables and Data Part 1 Relational Database Management System(RDBMS) 关系型数据库管理系统&#xff08;RDBMS&#xff09;是基于关系模型的数据库系统&#xff0c;它支持多种关系操作。关系模型是一种数据存储和检索的模型&#xff0c;它使用表格来组织数据&#x…

NestJS vs Fastify:Node.js框架的性能对决

在Node.js的世界中&#xff0c;框架的选择对于应用的性能和可维护性有着至关重要的影响。NestJS和Fastify是两个备受瞩目的框架&#xff0c;它们各自以其独特的优势在开发者社区中赢得了声誉。本文将深入探讨这两个框架的性能特点&#xff0c;并分析它们在不同场景下的适用性。…

【NOIP普及组】明明的随机数

【NOIP普及组】明明的随机数 C语言实现C实现Java实现Python实现 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 明明想在学校中请一些同学一起做一项问卷调查&#xff0c;为了实验的客观性&#xff0c;他先用计算机生成了N个1到1000之间的随…

python中t是什么意思

python中t是什么意思&#xff1f; python中t指的是“\r”&#xff1a;回车符&#xff0c;返回到这一行的开头&#xff0c;return的意思。 其他相关&#xff1a; \n&#xff1a;换行符&#xff0c;到下一行的同一位置&#xff0c;纵坐标相同&#xff0c;new line的意思。 \t…

OracleJDK与OpenJDK的区别(附带win11下多版本jdk安装)

OracleJDK与OpenJDK的区别&#xff08;附带win11下多版本jdk安装&#xff09; 在Java开发领域&#xff0c;OracleJDK与OpenJDK是两个常被提及的名词&#xff0c;它们都是Java开发工具包&#xff08;JDK&#xff09;的实现&#xff0c;但各自具有不同的特点和优势。在早期的jav…

代码随想录算法训练营第三十一天 | 56.合并区间 738.单调递增的数字 968.监控二叉树

LeetCode 56.合并区间&#xff1a; 文章链接 题目链接&#xff1a;56.合并区间 思路&#xff1a; ① 合并所有重叠的区间&#xff0c;合并后的区间数组不重叠&#xff0c;因此下面两种多区间重叠&#xff0c;其中的区间都要进行合并 ② 合并区间&#xff1a;因为情况2也算作…

[ComfyUI]FaceAging:太好玩啦!FaceAging终于装好了!负50到正100岁随心调整!超强又难装的节点安装教程来了! Comfyui教程

大家好&#xff01;今天我要向大家介绍一个超级有趣的话题——[ComfyUI]FaceAging&#xff01;这个工具能够让你轻松实现人脸年龄的调整&#xff0c;从负50岁到正100岁&#xff0c;让你的创作更加有趣和独特。 想象一下&#xff0c;你有一个强大的AI助手&#xff0c;它能够根据…

蓝桥杯真题——乐乐的序列和(C语言)

问题描述 乐乐在玩一个游戏&#xff0c;她有一排宝石&#xff0c;每个宝石上都刻有一个整数值。她的目标是从中挑选出一些宝石&#xff0c;使得选出的宝石数量为偶数&#xff0c;且这些宝石上的数字总和最大。如果不选任何宝石&#xff08;即选出宝石数量为 00&#xff0c;也是…

猫用宠物空气净化器哪个牌子好?求噪音小的宠物空气净化器推荐!

最近真是烦躁到了顶峰&#xff01;猫咪换毛季太折磨人了&#xff0c;白天上班累的要死&#xff0c;晚上回家还要和猫毛斗争。每天回家都是一场豪赌&#xff0c;需要花费的清理时间取决于家里的猫毛散落程度。有时候忙起来完全不想管&#xff0c;回到家只想躺着。 但最近身体出…

redis7学习笔记

文章目录 1. 简介1.1 功能介绍1.1.1 分布式缓存1.1.2 内存存储和持久化(RDBAOF)1.1.3 高可用架构搭配1.1.4 缓存穿透、击穿、雪崩1.1.5 分布式锁1.1.6 队列 1.2 数据类型StringListHashSetZSetGEOHyperLogLogBitmapBitfieldStream 2. 命令2.1 通用命令copydeldumpexistsexpire …