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;// 省略其他字段和方法
}

在上述示例中,我们定义了两个分组 FirstGroupSecondGroup,然后使用 @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)的注解。以下是一些常用的注解:

  1. 通用注解
  • @NotNull: 验证注解的元素值不是 null。
  • @Null: 验证注解的元素值是 null。
  • @AssertTrue: 验证注解的元素值是 true
  • @AssertFalse: 验证注解的元素值是 false
  • @Min(value): 验证注解的元素值大于等于指定的值。
  • @Max(value): 验证注解的元素值小于等于指定的值。
  • @Size(max, min): 验证注解的元素值的大小在指定的范围内。
  • @Digits(integer, fraction): 验证注解的元素值的整数部分和小数部分的数字不超过指定的数值。
  1. 字符串验证
  • @NotBlank: 验证注解的元素值不为空(不为 null、去掉前后空格后长度大于0)。
  • @NotEmpty: 验证注解的元素值不为 null 且不为空。
  • @Email: 验证注解的元素值是一个有效的电子邮件地址。
  1. 数值验证
  • @Positive: 验证注解的元素值是正数。
  • @PositiveOrZero: 验证注解的元素值是非负数。
  • @Negative: 验证注解的元素值是负数。
  • @NegativeOrZero: 验证注解的元素值是非正数。
  1. 日期和时间验证
  • @Past: 验证注解的元素值是过去的日期或时间。
  • @PastOrPresent: 验证注解的元素值是过去或当前的日期或时间。
  • @Future: 验证注解的元素值是将来的日期或时间。
  • @FutureOrPresent: 验证注解的元素值是将来或当前的日期或时间。
  1. 自定义注解
  • 你还可以创建自定义的注解,通过实现 ConstraintValidator 接口来定义自己的验证逻辑,并使用 @Constraint 注解进行声明。

这些注解可以通过在 Java Bean 的字段上使用来进行数据验证。在 Spring Boot 中,通常与 @Valid@Validated 一起使用,以触发验证。在上述提到的示例中,已经展示了一些常用注解的使用方式。

示例:
以下是常用定义校验的注解及其使用示例:

  1. @NotNull:被注解的元素必须不为null。例如:
public class User {@NotNull(message = "姓名不能为空")private String name;// ...其他字段...
}
  1. @NotEmpty:被注释的对象必须不为空(数据:String,Collection,Map,arrays)。例如:
public class User {@NotEmpty(message = "角色列表不能为空")private List<Role> roles;// ...其他字段...
}
  1. @NotBlank:CharSequence子类型,验证注解的元素值不为空(包括不为null或去除首位空格后长度为0)。例如:
public class User {@NotBlank(message = "手机号码不能为空")private String phoneNumber;// ...其他字段...
}
  1. @Min:验证数字是否小于等于指定的最小值。例如:
public class User {@Min(value = 18, message = "年龄不能低于18岁")private int age;// ...其他字段...
}
  1. @Max:验证数字是否大于等于指定的最大值。例如:
public class User {@Max(value = 60, message = "年龄不能超过60岁")private int age;// ...其他字段...
}
  1. @Pattern:用于校验字符串是否符合指定的正则表达式。例如:
public class User {@Pattern(regexp = "^\\d{6}$", message = "身份证号码格式不正确")private String idCardNumber;// ...其他字段...
}
  1. @Size:用于限制字符序列(如String、Collection、Map等)的长度,支持min和max属性。例如:
public class User {@Size(min = 6, max = 18, message = "密码长度必须在6-18之间")private String password;// ...其他字段...
}
  1. @Email:用于校验邮箱地址。例如:
public class User {@Email(message = "请输入正确的邮箱地址")private String email;// ...其他字段...
}
  1. @Past:用于判断日期是否在过去。例如:
public class User {@Past(message = "生日不能晚于现在")private Date birthday;// ...其他字段...
}
  1. @Future:用于判断日期是否在未来。例如:
public class User {@Future(message = "截止日期必须在未来")private Date deadline;// ...其他字段...
}
  1. @DecimalMax:验证数字是否小于等于指定的最大值。例如:
public class User {@DecimalMax(value = "100.00", message = "金额不能超过100元")private double amount;// ...其他字段...
}
  1. @DecimalMin:验证数字是否大于等于指定的最小值。例如:
public class User {@DecimalMin(value = "1.00", message = "价格不能低于1元")private double price;// ...其他字段...
}

以上都是常见的数据校验注解,使用这些注解可以让我们的应用程序具有更强的健壮性,避免非法数据的输入。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11 Go的作用域

概述 在上一节的内容中&#xff0c;我们介绍了Go的映射&#xff0c;包括&#xff1a;声明映射、初始化映射、操作映射等。在本节中&#xff0c;我们将介绍Go的作用域。在Go语言中&#xff0c;作用域是指变量的可见性范围&#xff0c;它定义了变量在程序中的生命周期和可访问性。…

c语言从入门到实战——基于指针的数组与指针数组

基于指针的数组与指针数组 前言1. 数组名的理解2. 使用指针访问数组3. 一维数组传参的本质4. 冒泡排序5. 二级指针6. 指针数组7. 指针数组模拟二维数组 前言 指针的数组是指数组中的元素都是指针类型&#xff0c;它们指向某种数据类型的变量。 1. 数组名的理解 我们在使用指针…

MongoDB是一个NoSQL数据库,有着多种不同的命令和操作。以下是一些常见的MongoDB命令:

show dbs&#xff1a;列出所有数据库use db_name&#xff1a;切换到指定的数据库db.dropDatabase()&#xff1a;删除当前数据库db.createCollection("collection_name")&#xff1a;创建集合db.collection_name.insert(document)&#xff1a;向指定集合插入数据db.co…

手机厂商参与“百模大战”,vivo发布蓝心大模型

在2023 vivo开发者大会上&#xff0c;vivo发布自研通用大模型矩阵——蓝心大模型&#xff0c;其中包含十亿、百亿、千亿三个参数量级的5款自研大模型&#xff0c;其中&#xff0c;10亿量级模型是主要面向端侧场景打造的专业文本大模型&#xff0c;具备本地化的文本总结、摘要等…

【PyQt】(自制类)处理鼠标点击逻辑

写了个自认为还算不错的类&#xff0c;用于简化mousePressEvent、mouseMoveEvent和mouseReleaseEvent中的鼠标信息。 功能有以下几点&#xff1a; 鼠标当前状态&#xff0c;包括鼠标左/中/右键和单击/双击/抬起鼠标防抖(仅超出一定程度时才判断鼠标发生了移动)&#xff0c;灵…

【算法练习Day48】回文子串最长回文子序列

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 回文子串最长回文子序列总结…

深入理解Java中的String.join方法

在 Java 编程中&#xff0c;字符串操作是非常常见的需求。在 Java 8 中引入了一个方便的字符串连接方法 String.join&#xff0c;它能够简洁而高效地将多个字符串连接起来。本篇博客将深入介绍 String.join 方法的使用和原理。 什么是String.join方法&#xff1f; String.join…

百度文心一言

1分钟了解一言是谁&#xff1f; 一句话介绍【文心一言】 我是百度研发的人工智能模型&#xff0c;任何人都可以通过输入【指令】和我进行互动&#xff0c;对我提出问题或要求&#xff0c;我能高效地帮助你们获取信息、知识和灵感哦 什么是指令&#xff1f;我该怎么和你互动&am…

2023年03月 Python(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 已知一个列表lst = [2,3,4,5,6],lst.append(20),print(lst)的结果是?( )(2分) A.[10,2,3,4,5,6,20] B.[20,2,10,3,4,5,6] C.[2,3,4,5,6,20] D.[2,3,4,5,6,10,20] 答案:C 第2…

Vatee万腾的数字化掌舵:Vatee科技引领未来的新高度

随着数字化时代的到来&#xff0c;Vatee万腾以其卓越的科技决策力成为引领潮流的掌舵者。 Vatee万腾通过对科技前沿的不懈探索&#xff0c;站在了数字化创新的最前沿。其领先的科技团队致力于发掘并应用最新的数字技术&#xff0c;为用户提供卓越的数字化体验。 Vatee万腾以其…

HarmonyOS元服务实现今天吃什么

一、前言 作为一个职业打工人&#xff0c;每天点外卖吃啥东西都有选择综合症&#xff0c;突发奇想让程序帮我们随机选择一个吃的&#xff0c;是不是可以解决我们的选择问题呢&#xff0c;说干就干&#xff0c;我们就使用HarmonyOS元服务实现一下这个功能。为什么选择这个Harmon…

wpf devexpress设置行和编辑器

如下教程示范如何计算行布局&#xff0c;特定的表格单元编辑器&#xff0c;和格式化显示值。这个教程基于前一个文章 选择行显示 GridControl为所有字段生成行和绑定数据源&#xff0c;如果AutoGenerateColumns 属性选择AddNew。添加行到GridControl精确显示为特别的几行设置。…

联想小新Pro14默认设置的问题

联想小新Pro14 锐龙版&#xff0c;Win11真的挺多不习惯的&#xff0c;默认配置都不符合一般使用习惯。 1、默认人走过自动开机。人机互动太强了&#xff1b; 2、默认短超时息屏但不锁屏&#xff0c;这体验很容易觉得卡机然后唤起&#xff0c;却又不用密码打开&#xff1b; 3…

[论文分享] Never Mind the Malware, Here’s the Stegomalware

Never Mind the Malware, Here’s the Stegomalware [IEEE Security & Privacy 2022] Luca Caviglione | National Research Council of Italy Wojciech Mazurczyk | Warsaw University of Technology and FernUniversitt in Hagen 近年来&#xff0c;隐写技术已逐渐被观…

kubernetes istio

目录 一、部署 二、部署示例应用 三、部署遥测组件 四、流量管理 五、熔断 官网&#xff1a;https://istio.io/latest/zh/about/service-mesh/ 一、部署 提前准备好文件 tar zxf 15t10-1.19.3-linux-amd64.tar.gz cd 15t10-1.19.3/ export PATH$PWD/bin:$PATHistioctl install …

python生成n个指定范围内的随机数 tensor转list list中的小数保留两位小数 根据零样本学习的S和H和偏移量计算H的值

python生成n个随机数 import randomdef get_random_num1(n5,m2):# 生成4个-1到1之间的随机小数&#xff0c;包含左边的元素&#xff0c;不包含右边的元素random_numbers [round(random.uniform(-2, 0), 2) for _ in range(n)]random_numbers[m] 0return random_numbers# 生成…

刷题笔记(第七天)

1.找出对象 obj 不在原型链上的属性(注意这题测试例子的冒号后面也有一个空格~) 返回数组&#xff0c;格式为 key: value结果数组不要求顺序 输入&#xff1a; var C function() {this.foo ‘bar’; this.baz ‘bim’;}; C.prototype.bop ‘bip’; iterate(new C()); 输出…

保姆级使用vuedraggable三方组件

第一步 引入vuedraggable npm i vuedraggable -S 第二步 直接使用&#xff0c;源码如下 <template><draggableclass"list-group"tag"ul"v-model"list"v-bind"{animation: 1000,group: description,disabled: false,ghostClass:…

绘图软件 OmniGraffle mac中文版特点说明

OmniGraffle mac是一款图形绘制和图表设计软件&#xff0c;主要面向 macOS 和 iOS 平台。它适用于用户创建流程图、组织结构图、原型设计、网站线框图、地图等各种类型的图形。该软件的界面直观&#xff0c;用户友好&#xff0c;让用户能够轻松地创建和编辑复杂的图形。 OmniGr…

部署百川大语言模型Baichuan2

Baichuan2是百川智能推出的新一代开源大语言模型&#xff0c;采用 2.6 万亿 Tokens 的高质量语料训练。在多个权威的中文、英文和多语言的通用、领域 benchmark 上取得同尺寸最佳的效果。包含有 7B、13B 的 Base 和 Chat 版本&#xff0c;并提供了 Chat 版本的 4bits 量化。 模…