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…...

面试其他注意事项
面试其他注意事项 一、面试反问 这个岗位的日常工作和主要职责是什么?咱们这边主要负责什么业务,用到了哪些技术呢?对于我们校招生有没有培养体系呢?脱产培训,还是边工作边熟悉?会有导师带嘛?…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...

自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...