spring boot validation使用
spring-boot-starter-validation 是 Spring Boot 中用于支持数据验证的模块。它建立在 Java Validation API(JSR-380)之上,提供了一种方便的方式来验证应用程序中的数据。以下是使用 spring-boot-starter-validation 的基本方法:
快速入门
1.添加依赖:
在你的 Spring Boot 项目的 pom.xml 文件中,添加以下依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>
如果你使用 Gradle,可以在 build.gradle 文件中添加:
implementation 'org.springframework.boot:spring-boot-starter-validation'
2.创建验证规则:
在需要进行数据验证的类中,使用 Java Validation API 中的注解标记字段,以定义验证规则。例如,使用 @NotBlank 来确保字段不为空:
public class MyRequest {@NotBlankprivate String name;/*** 1.@NotNull:不能为null,但可以为empty(""," "," ") * 2.@NotEmpty:不能为null,而且长度必须大于0 (" "," ")* 3.@NotBlank:只能作用在String上,不能为null,而且调用trim()后,长度必须大于0("test") 即:必须有实际字符* 复制代码*/@NotBlank(message="用户名不能为空")private String userName;@NotBlank(message="年龄不能为空")@Pattern(regexp="^[0-9]{1,2}$",message="年龄不正确")private String age;@AssertFalse(message = "必须为false")private Boolean isFalse;/*** 如果是空,则不校验,如果不为空,则校验*/@Pattern(regexp="^\\d{4}(-)(1[0-2]|0?\\d)\\1([0-2]\\d|\\d|30|31)$",message="出生日期格式不正确")private String birthday;@Pattern(regexp = "^[M|F|U|m|f|u]{1}$")private String gender;@Pattern(regexp = "^(MS)?(MR)?(PRO)?(MRS)?(DOC)?$")private String civility;@Size(min = 1, message = "field names can't be empty")private List<String> names = new ArrayList();// Other fields and methods...
}
这只是一个简单的例子,Java Validation API 提供了许多其他注解,如 @NotNull、@Min、@Max、@Email 等,以满足各种验证需求。
3.在控制器中使用验证:
在需要验证输入数据的地方,通常是在 Spring MVC 的控制器中,使用 @Valid 注解来启用验证:
@RestController
public class MyController {@PostMapping("/submit")public ResponseEntity<String> submit(@Valid @RequestBody MyRequest request) {// Process the validated requestreturn ResponseEntity.ok("Request is valid");}
}
在上面的例子中,@Valid 注解用于告诉 Spring Boot 对 MyRequest 对象进行验证。如果验证失败,将会抛出 MethodArgumentNotValidException 异常。
4.处理验证错误:
若要处理验证错误,可以使用 BindingResult 对象。修改控制器方法以接受 BindingResult 参数,并检查是否有错误:
@RestController
public class MyController {@PostMapping("/submit")public ResponseEntity<String> submit(@Valid @RequestBody MyRequest request, BindingResult bindingResult) {if (bindingResult.hasErrors()) {// Handle validation errorsreturn ResponseEntity.badRequest().body("Validation errors");}// Process the validated requestreturn ResponseEntity.ok("Request is valid");}
}
这就是使用 spring-boot-starter-validation 的基本步骤。通过这种方式,你可以方便地在 Spring Boot 应用程序中进行数据验证,确保输入数据的合法性。
分组校验
在使用 Spring Boot Validation 进行分组校验时,你可以使用 Validation API 提供的 @GroupSequence 注解来定义校验顺序。下面是一个简单的示例,演示如何在 Spring Boot 中实现分组校验。
首先,假设你有一个包含分组信息的 Java Bean 类:
import javax.validation.GroupSequence;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;public class MyRequest {// 定义分组public interface FirstGroup {}public interface SecondGroup {}// 定义分组顺序@GroupSequence({FirstGroup.class, SecondGroup.class})public interface AllGroups {}// 分组校验示例@NotNull(message = "ID不能为空", groups = FirstGroup.class)private Long id;@NotBlank(message = "姓名不能为空", groups = SecondGroup.class)private String name;@NotNull(groups = {FirstGroup.class, SecondGroup.class}, message = "密码不能为空")private String password;// 省略其他字段和方法
}
在上述示例中,我们定义了两个分组 FirstGroup 和 SecondGroup,然后使用 @GroupSequence 注解定义了它们的顺序。接着,在字段上使用 @NotNull 和 @NotBlank 注解,并通过 groups 属性指定了校验时所属的分组。
接下来,在你的控制器或服务中,使用 @Validated 注解来指定使用哪个分组进行校验:
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;@RestController
@Validated
public class MyController {@PostMapping("/submit")public String submit(@Validated(MyRequest.FirstGroup.class) @RequestBody MyRequest request) {// 处理请求return "Request is valid";}@PostMapping("/update")public String update(@Validated(MyRequest.SecondGroup.class) @RequestBody MyRequest request) {// 处理请求return "Request is valid";}
}
在上述示例中,@Validated 注解用于标记控制器,然后在方法参数上使用 @Validated 注解来指定使用哪个分组进行校验。在 /submit 接口中使用了 FirstGroup 进行校验,而在 /update 接口中使用了 SecondGroup 进行校验。
这样,你就可以实现基于分组的校验。请注意,分组的顺序是在 @GroupSequence 注解中定义的。
@Validated与@Valid 的区别
@Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制,这个网上也有资料,不详述。
@Valid:作为标准JSR-303规范,还没有吸收分组的功能。
常用注解说明
在 Spring Boot 中,用于数据验证的常用注解是来自 Java Validation API(JSR-380)的注解。以下是一些常用的注解:
- 通用注解:
@NotNull: 验证注解的元素值不是 null。@Null: 验证注解的元素值是 null。@AssertTrue: 验证注解的元素值是true。@AssertFalse: 验证注解的元素值是false。@Min(value): 验证注解的元素值大于等于指定的值。@Max(value): 验证注解的元素值小于等于指定的值。@Size(max, min): 验证注解的元素值的大小在指定的范围内。@Digits(integer, fraction): 验证注解的元素值的整数部分和小数部分的数字不超过指定的数值。
- 字符串验证:
@NotBlank: 验证注解的元素值不为空(不为 null、去掉前后空格后长度大于0)。@NotEmpty: 验证注解的元素值不为 null 且不为空。@Email: 验证注解的元素值是一个有效的电子邮件地址。
- 数值验证:
@Positive: 验证注解的元素值是正数。@PositiveOrZero: 验证注解的元素值是非负数。@Negative: 验证注解的元素值是负数。@NegativeOrZero: 验证注解的元素值是非正数。
- 日期和时间验证:
@Past: 验证注解的元素值是过去的日期或时间。@PastOrPresent: 验证注解的元素值是过去或当前的日期或时间。@Future: 验证注解的元素值是将来的日期或时间。@FutureOrPresent: 验证注解的元素值是将来或当前的日期或时间。
- 自定义注解:
- 你还可以创建自定义的注解,通过实现
ConstraintValidator接口来定义自己的验证逻辑,并使用@Constraint注解进行声明。
这些注解可以通过在 Java Bean 的字段上使用来进行数据验证。在 Spring Boot 中,通常与 @Valid 或 @Validated 一起使用,以触发验证。在上述提到的示例中,已经展示了一些常用注解的使用方式。
示例:
以下是常用定义校验的注解及其使用示例:
@NotNull:被注解的元素必须不为null。例如:
public class User {@NotNull(message = "姓名不能为空")private String name;// ...其他字段...
}
@NotEmpty:被注释的对象必须不为空(数据:String,Collection,Map,arrays)。例如:
public class User {@NotEmpty(message = "角色列表不能为空")private List<Role> roles;// ...其他字段...
}
@NotBlank:CharSequence子类型,验证注解的元素值不为空(包括不为null或去除首位空格后长度为0)。例如:
public class User {@NotBlank(message = "手机号码不能为空")private String phoneNumber;// ...其他字段...
}
@Min:验证数字是否小于等于指定的最小值。例如:
public class User {@Min(value = 18, message = "年龄不能低于18岁")private int age;// ...其他字段...
}
@Max:验证数字是否大于等于指定的最大值。例如:
public class User {@Max(value = 60, message = "年龄不能超过60岁")private int age;// ...其他字段...
}
@Pattern:用于校验字符串是否符合指定的正则表达式。例如:
public class User {@Pattern(regexp = "^\\d{6}$", message = "身份证号码格式不正确")private String idCardNumber;// ...其他字段...
}
@Size:用于限制字符序列(如String、Collection、Map等)的长度,支持min和max属性。例如:
public class User {@Size(min = 6, max = 18, message = "密码长度必须在6-18之间")private String password;// ...其他字段...
}
@Email:用于校验邮箱地址。例如:
public class User {@Email(message = "请输入正确的邮箱地址")private String email;// ...其他字段...
}
@Past:用于判断日期是否在过去。例如:
public class User {@Past(message = "生日不能晚于现在")private Date birthday;// ...其他字段...
}
@Future:用于判断日期是否在未来。例如:
public class User {@Future(message = "截止日期必须在未来")private Date deadline;// ...其他字段...
}
@DecimalMax:验证数字是否小于等于指定的最大值。例如:
public class User {@DecimalMax(value = "100.00", message = "金额不能超过100元")private double amount;// ...其他字段...
}
@DecimalMin:验证数字是否大于等于指定的最小值。例如:
public class User {@DecimalMin(value = "1.00", message = "价格不能低于1元")private double price;// ...其他字段...
}
以上都是常见的数据校验注解,使用这些注解可以让我们的应用程序具有更强的健壮性,避免非法数据的输入。
相关文章:
spring boot validation使用
spring-boot-starter-validation 是 Spring Boot 中用于支持数据验证的模块。它建立在 Java Validation API(JSR-380)之上,提供了一种方便的方式来验证应用程序中的数据。以下是使用 spring-boot-starter-validation 的基本方法: …...
Hadoop3.3.4分布式安装
安装前提:已经配置好java环境,所有机器之间ssh的免密登录。 注意:下文中的flinkv1、flinkv2、flinkv3是三台服务器的别名 1.集群部署规划 注意:NameNode和SecondaryNameNode不要安装在同一台服务器 注意:ResourceMan…...
SQL ALTER TABLE 语句||SQL AUTO INCREMENT 字段
SQL ALTER TABLE 语句 ALTER TABLE 语句 ALTER TABLE 语句用于在现有表中添加、删除或修改列。 SQL ALTER TABLE 语法 若要向表中添加列,请使用以下语法: ALTER TABLE table_name ADD column_name datatype 若要删除表中的列&am…...
【源码系列】短剧系统开发国际版短剧系统软件平台介绍
系统介绍 短剧是一种快节奏、紧凑、有趣的戏剧形式,通过短时间的精彩表演,向观众传递故事的情感和思考。它以其独特的形式和魅力,吸引着观众的关注,成为了当代戏剧娱乐中不可或缺的一部分。短剧每一集都是一个小故事,…...
JavaWeb[总结]
文章目录 一、Tomcat1. BS 与 CS 开发介绍1.1 BS 开发1.2 CS 开发 2. 浏览器访问 web 服务过程详解(面试题)2.1 回到前面的 JavaWeb 开发技术栈图2.2 浏览器访问 web 服务器文件的 UML时序图(过程) ! 二、动态 WEB 开发核心-Servlet1. 为什么会出现 Servlet2. 什么是…...
如何解决小程序异步请求问题
小程序异步请求问题指的是在小程序中进行异步请求时可能会出现的问题,比如请求失败、请求超时等。以下是一些解决方案: 检查网络连接:首先需要确保网络连接正常,只有网络连接正常时才能正常进行异步请求。 检查请求参数ÿ…...
NSSCTF第12页(3)
[NSSCTF 2nd]php签到 首先,代码定义了一个名为 waf 的函数,用于执行一个简单的文件扩展名检查来防止上传恶意文件。 $black_list 是一个存储不允许的文件扩展名的数组,如 “ph”、“htaccess” 和 “ini”。 pathinfo($filename, PATHINF…...
基于ssm+vue交通事故档案系统
摘要 摘要是对文章、论文或其他文本的主要观点、结论和关键信息的简洁概括。由于你没有提供具体的文章或主题,我将为你创建一个通用的摘要。 本文介绍了一种基于SSM(Spring Spring MVC MyBatis)和Vue.js的交通事故档案管理系统的设计与实现…...
DNS1(Bind软件)
名词解释 1、DNS(Domain Name System) DNS即域名系统,它是一个分层的分布式数据库,存储着IP地址与主机名的映射 2、域和域名 域为一个标签,而有多个标签域构成的称为域名。例如hostname.example.com,其…...
PDF自动打印
最近接到用户提过来的需求,需要一个能够自动打印图纸的功能,经过几天的研究整出来个初版了的,分享出来给大家,希望能有帮助。 需求描述: 生产车间现场每天都有大量的图纸需要打印,一个一个打印太慢了࿰…...
【C#】类型转换-显式转换:括号强转、Parse法、Convert法、其他类型转string
目录 一、括号强转 1.有符号整型 2.无符号整型 3.浮点之间 4.无符号和有符号 5.浮点和整型 6.char和数值类型 7.bool和string是不能够通过 括号强转的 二、Parse法 1.有符号 2.无符号 3.浮点型 4.特殊类型 三、Convert法 1.转字符串 2.转浮点型 3.特殊类型转换…...
【智能家居】4、智能家居框架设计和代码文件工程建立
目录 一、智能家居项目框架 二、智能家居工厂模式示意 三、代码文件工程建立 SourceInsight创建新工程步骤 一、智能家居项目框架 二、智能家居工厂模式示意 三、代码文件工程建立 创建一个名为si的文件夹用于保存SourceInsight生成的文件信息,然后在SourceInsig…...
【GAN】数据增强基础知识
最近要用到,但是一点基础都没有,故开个文章记录一下笔记 目录 GAN DCGAN WGAN EEGGAN GAN 参考 生成对抗网络(GAN) - 知乎 (zhihu.com) 文章 [1406.2661] Generative Adversarial Networks (arxiv.org) 代码 GitHub - …...
Skywalking流程分析_3(服务的准备、启动、关闭)
前文将SkyWalkingAgent.premain中的: SnifferConfigInitializer.initializeCoreConfig(agentArgs)pluginFinder new PluginFinder(new PluginBootstrap().loadPlugins())这两个方法分析完毕,下面继续分析premain方法其余部分 创建byteBuddy final By…...
mysql中的各种日志文件redo log、undo log和binlog
mysql中的各种日志文件redo log、undo log和binlog mysql中的各种日志文件redo log、undo log和binlog1.MySQL日志文件类型2.redo log日志2.1 作用2.2工作原理:2.3详解 3.undo log日志4.binlog日志5.总结 mysql中的各种日志文件redo log、undo log和binlog 1.MySQL…...
【电视剧-长相思】经典语录
小编看了这么长时间的电视剧,突然感觉摘抄经典语录最有成就感,嘿嘿,下面是我在《长相思》(第一季)中感觉好的一些语录,语录是乱序排列哈 玟小六:我怕寂寞,寻不到长久的相依ÿ…...
串口通信原理及应用
Content 1. 前言介绍2. 连接方式3. 数据帧格式4. 代码编写 1. 前言介绍 串口通信是一种设备间非常常用的串行接口,以比特位的形式发送或接收数据,由于成本很低,容易使用,工程师经常使用这种方式来调试 MCU。 串口通信应用广泛&a…...
python爬取穷游网景点评论
爬取穷游网的景点评论数据,使用selenium爬取edge浏览器的网页文本数据。 同程的评论数据还是比较好爬取,不像大众点评需要你登录验证杂七杂八的,只需要找准你想要爬取的网页链接就能拿到想要的文本数据。 这里就不得不提一下爬取过程中遇到的…...
Phar 文件上传以及反序列化
1.phar反序列化 触发条件: 1、能将phar文件上传 2、可利用函数 stat、fileatime、filectime、file_exists、file_get_contents、file_put_contents、file、filegroup、fopen、fileinode、filemtime、fileowner、fileperms、is_dir、is_executable、is_file、is_link…...
面试其他注意事项
面试其他注意事项 一、面试反问 这个岗位的日常工作和主要职责是什么?咱们这边主要负责什么业务,用到了哪些技术呢?对于我们校招生有没有培养体系呢?脱产培训,还是边工作边熟悉?会有导师带嘛?…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...
