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

面试其他注意事项
面试其他注意事项 一、面试反问 这个岗位的日常工作和主要职责是什么?咱们这边主要负责什么业务,用到了哪些技术呢?对于我们校招生有没有培养体系呢?脱产培训,还是边工作边熟悉?会有导师带嘛?…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

高效的后台管理系统——可进行二次开发
随着互联网技术的迅猛发展,企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心,成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统,它不仅支持跨平台应用,还能提供丰富…...