当前位置:网站首页>【全网最全】JSR303参数校验与全局异常处理(从理论到实践别用if判断参数了)
【全网最全】JSR303参数校验与全局异常处理(从理论到实践别用if判断参数了)
2022-04-22 18:27:00 【掉发的小王】
Table of Contents
一、前言
我们在日常开发中,避不开的就是参数校验,有人说前端不是会在表单中进行校验的吗?在后端中,我们可以直接不管前端怎么样判断过滤,我们后端都需要进行再次判断,为了安全。因为前端很容易拜托,当测试使用PostMan来测试,如果后端没有校验,不就乱了吗?肯定会有很多异常的。今天小编和大家一起学习一下JSR303专门用于参数校验的,算是一个工具吧!
二、JSR303简介
JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是Hibernate Validator。
Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。
官网介绍:
验证数据是一项常见任务,它发生在从表示层到持久层的所有应用程序层中。通常在每一层都实现相同的验证逻辑,这既耗时又容易出错。为了避免重复这些验证,开发人员经常将验证逻辑直接捆绑到域模型中,将域类与验证代码混在一起,而验证代码实际上是关于类本身的元数据。

Jakarta Bean Validation 2.0 - 为实体和方法验证定义了元数据模型和 API。默认元数据源是注释,能够通过使用 XML 覆盖和扩展元数据。API 不依赖于特定的应用程序层或编程模型。它特别不依赖于 Web 或持久层,并且可用于服务器端应用程序编程以及富客户端 Swing 应用程序开发人员。

三、导入依赖
四、常用注解
| 约束注解名称 | 约束注解说明 |
|---|---|
| @Null | 用于验证对象为null |
| @NotNull | 用于对象不能为null,无法查检长度为0的字符串 |
| @NotBlank | 只用于String类型上,不能为null且trim()之后的size>0 |
| @NotEmpty | 用于集合类、String类不能为null,且size>0。但是带有空格的字符串校验不出来 |
| @Size | 用于对象(Array,Collection,Map,String)长度是否在给定的范围之内 |
| @Length | 用于String对象的大小必须在指定的范围内 |
| @Pattern | 用于String对象是否符合正则表达式的规则 |
| 用于String对象是否符合邮箱格式 | |
| @Min | 用于Number和String对象是否大等于指定的值 |
| @Max | 用于Number和String对象是否小等于指定的值 |
| @AssertTrue | 用于Boolean对象是否为true |
| @AssertFalse | 用于Boolean对象是否为false |
所有的大家参考jar包

五、@Validated、@Valid区别
@Validated:
- Spring提供的
- 支持分组校验
- 可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上
- 由于无法加在成员属性(字段)上,所以无法单独完成级联校验,需要配合@Valid
@Valid:
- JDK提供的(标准JSR-303规范)
- 不支持分组校验
- 可以用在方法、构造函数、方法参数和成员属性(字段)上
- 可以加在成员属性(字段)上,能够独自完成级联校验
总结:@Validated用到分组时使用,一个学校对象里还有很多个学生对象需要使用@Validated在Controller方法参数前加上,@Valid加在学校中的学生属性上,不加则无法对学生对象里的属性进行校验!
例子:
六、常用使用测试
1. 实体类添加校验
2. 统一返回类型
3. 测试类
遇到的坑:小编在公司的项目中添加没什么问题,但是就是无法触发校验,看到的是Springboot版本太高了,所有要添加下面的依赖才触发。
4. 普通测试结果

5. 我们把异常返回给页面
6. 异常处理结果
七、抽离全局异常处理
1. 心得体会
上面我们要在每个校验的接口上面写,所以我们要抽离出来做个全局异常。并且要改进一下,原来的是把错误信息放到data里,但是正常情况下的data是返回给前端的数据。我们这样把异常数据放进去,会使data的数据有二义性。这样对于前端就不知道里面是数据还是报错信息了哈,这样就可以直接前端展示msg里面的提示即可!
2. 书写ExceptionControllerAdvice
3. 测试结果
八、分组校验
1. 需求
我们在做校验的时候,通常会遇到一个实体类的添加和修改,他们的校验规则是不同的,所以分组显得尤为重要。他可以帮助我们少建一个冗余的实体类,所以我们必须要会的。
2. 创建分组接口(不需写任何内容)
3. 在需要二义性的字段上添加分组
4. 不同Controller添加校验规则
注意:我们要进行分组,所以@Valid不能使用了,要使用@Validated。相信大家已经看到上面的他俩区别了哈!
5. 测试


九、自定义校验
1.定义自定义校验器
2. 定义一个注解配合校验器使用
3. 实体类添加一个新的校验属性
注意:我们上面做了分组,如果属性不指定分组,则不会生效,现在我们的部分属性校验已没有起作用,现在只有brandId和showStatus起作用。
4. 测试


十、总结
这样就差不多对JSR303有了基本了解,满足基本开发没有什么问题哈!看到这里了,收藏点赞一波吧,整理了将近一天!!谢谢大家了!!
<hr>
有缘人才能看到,自己网站,欢迎访问!!!
版权声明
本文为[掉发的小王]所创,转载请带上原文链接,感谢
https://blog.51cto.com/wangzhenjun/5245710
边栏推荐
- Zeromq: Event Monitoring
- How do I completely delete files on my computer?
- Read and write txt files in C language
- Topic5——198. raid homes and plunder houses
- 详细理解GaussDB以及怎么做数据迁移【玩转华为云】
- Some problems encountered when using docker to create MySQL master-slave backup
- 在 Kubernetes 集群中部署现代应用的通用模式
- filter执行原理深度剖析(bitset机制与caching机制)
- 数字化靶场的未来方向
- 【接口测试基础】第九篇 | 详解PostMan全局变量和环境变量
猜你喜欢

One click download scheme of serial port of esp32 / esp8266 series single chip microcomputer without peripheral circuit

力扣-64.最小路径和

图像的卷积——【torch学习笔记】

Domestic chip dp9637-k bus transceiver replaces l9637d chip and si9241

Design the test paper storage scheme of ten million students management system

Pytoch Note58 CNN可视化

Future direction of digital shooting range

大话JMeter4|不同的并发数可以自动化做压测吗?

leetcode - 234. 回文链表

Build China's cloud ecology | Huayun data and Baixin complete product compatibility and mutual certification and jointly promote the high-quality development of information innovation industry
随机推荐
.net core 多项目中使用EFCore
Design the test paper storage scheme of ten million students management system
[2021] Tencent autumn recruitment technology post programming arrangement supermarket
.net core 中使用IAsyncExceptionFilter 捕获全局异常,统一返回信息
mysql 之 MHA
uniapp处理强制刷新问题
An idea plug-in that doesn't work, but can install X
关于.net core 中使用ActionFilter 以及ActionFilter的自动事务
广东水泥数据概况
国产芯片DP9637-K总线收发器替代L9637D芯片和SI9241
知乎热议:浙大读博八年现靠送外卖赚钱
Deleted items can be recovered even after the outlook Deleted Items folder is empty
接口协议之抓包分析 TCP 协议
小程序----组件
电脑硬件中最重要的部分是什么?
支付宝开放平台应用— 乡镇卫生院申请
In 2022, it is said on the Internet that Apple's upcoming new models iPhone 14 pro and iPhone 14 Pro Max will be a new screen shape, not a banged screen. Do you expect the iPhone 14 with a new screen
leetcode 111:二叉树的最小深度
Read and write txt files in C language
【浏览器】谷歌浏览器自带翻译失效