环境:SpringBoot2.6.12
实际的开发工作中大部分的接口都是需要进行参数有效性校验的 , 参数可能是简单的基本数据类型,也可能是对象类型 , 基本上所有接收参数的接口都是需要对这些参数进行校验的,你对这些参数是怎么校验的?接下来带你一起见识下我在实际项目中都应用过哪些校验姿势! 。该案例会详细介绍如下 7 方面的内容 。
- 简单参数校验
- 参数校验分组
- 单个参数校验
- 嵌套参数校验
- 自定义工具类参数校验
- 国际化支持
- AOP 验证参数统一处理
在正式介绍主体内容前我们还是先要了解学习一些规范 JSR303 。
JSR 是什么?JSR 是 JAVA Specification Requests 的缩写,意思是 Java 规范提案 。是指向 JCP(Java Community Process)提出新增一个标准化技术规范的正式请求 。任何人都可以提交 JSR,以向 Java 平台增添新的 API 和服务 。JSR 已成为 Java 界的一个重要标准 。JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,Hibernate Validator 是 Bean Validation 的参考实现 . Hibernate Validator 提供了 JSR 303 规范中所有内置 constrAInt 的实现 , 除此之外还有一些附加的 constraint 。相关注解如下:

文章插图
图片
在Spring中提供了SpringValidation验证框架对参数的验证机制提供了@Validated(Spring'sJSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR-303规范),结合BindingResult对象可以直接获取错误信息 。在本案中这两种是等效的 , 但是也有区别,在接下来的案例中将会说明 。
1. 配置依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><scope>runtime</scope></dependency></dependencies>org.aspectj 依赖是在最后我们要通过 AOP 技术来实现统一参数的校验 。2. 参数验证
- 简单参数校验
public class Users {@NotEmpty(message = "姓名必需填写")private String name ;@Min(value = https://www.isolves.com/it/cxkf/kj/2023-11-08/10, message = "年龄不能小于 10")private Integer age ;@Length(min = 6, max = 18, message = "邮箱介于 6 到 18 之间")private String email ;@NotEmpty(message = "电话必需填写")private String phone ;// 这里的2个接口在下面的案例中会使用到public static interface G1 {}public static interface G2 {}}这里对需要校验的字段都应用了不同的注解来约束 。接下来就是在Controller接口上添加相应的注解即可:@ResponseBodypublic class UsersController extends BaseController {@RequestMApping(value = https://www.isolves.com/it/cxkf/kj/2023-11-08/"/valid/save1", method = RequestMethod.POST)public Object save1(@RequestBody @Validated Users user, BindingResult result) {Optional> op = valid(result) ;if (op.isPresent()) {return op.get() ;}return "success" ;}}public class BaseController {protected Optional> valid(BindingResult result) {if (result.hasErrors()) {return Optional.of(result.getAllErrors().stream().map(err -> err.getDefaultMessage()).collect(Collectors.toList())) ;}return Optional.empty() ;}}
接收参数的 Users 对象前面要是用@Validated 注解,并且通过 BindingResult 来收集错误信息(可判断是否有错误信息);测试如下:
文章插图
图片
正确情况

文章插图
图片
- 参数校验分组
public class Users {@NotEmpty(message = "姓名不能为空", groups = G1.class)private String name ;@Min(value = https://www.isolves.com/it/cxkf/kj/2023-11-08/10, message = "年龄不能小于 10", groups = G1.class)@Min(value = 20, message = "年龄不能小于 20", groups = G2.class)private Integer age ;@Length(min = 6, max = 18, message = "邮箱介于 6 到 18 之间", groups = {G1.class, G2.class})private String email ;@NotEmpty(message = "电话必需填写")private String phone ;public static interface G1 {}public static interface G2 {}}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 真我v3手机配置参数,真我v3为什么没有屏幕刷新率
- 聊聊接口重试机制的几种解决方案
- 如何查看显卡型号及参数
- 苹果12手机参数配置,苹果12参数详细参数配置
- tr4怎么过,tr4x3螺纹参数
- Springboot 框架中事件监听和发布机制详细介绍
- tpc接口是什么,tpc接口长什么样
- 如何将本地jar文件打包到 springboot 执行jar文件中
- vivoy52s参数配置
- 显卡接口是什么意思,问独立显卡的2个接口都是做什么的
