springboot使用Validation API和全局异常优雅的校验方法参数
目录
一、为什么使用 Validation 来验证参数
二、如何使用Validation相关注解进行参数校验
三、Validation类的相关注解及描述
四、使用 Validation API 进行参数效验步骤
五、 Spring Validation的三种校验方式
五、springboot项目中实战演练
补充:使用自定义参数注解
一、为什么使用 Validation 来验证参数
通常我们在使用spring框架编写接口时,对于部分接口的参数我们要进行判空或者格式校验来避免程序出现异常。那是我们一般都是使用if-else逐个对参数进行校验。这种方法按逻辑来说也是没有问题的,同样也能实现预期效果。但是,这样的代码从可读性以及美观程序来看,是非常糟糕的。那么,我们就可以使用@valid注解来帮助我们优雅的校验参数。
二、如何使用Validation相关注解进行参数校验
①为实体类中的参数或者对象添加相应的注解;②在控制器层进行注解声明,或者手动调用校验方法进行校验;③对异常进行处理;
三、Validation类的相关注解及描述
验证注解 | 验证的数据类型 | 说明 |
---|---|---|
@AssertFalse | Boolean,boolean | 验证注解的元素值是false |
@AssertTrue | Boolean,boolean | 验证注解的元素值是true |
@NotNull | 任意类型 | 验证注解的元素值不是null |
@Null | 任意类型 | 验证注解的元素值是null |
@Min(value=值) | BigDecimal,BigInteger, byte,short, int, long,等任何Number或CharSequence(存储的是数字)子类型 | 验证注解的元素值大于等于@Min指定的value值 |
@Max(value=值) | 和@Min要求一样 | 验证注解的元素值小于等于@Max指定的value值 |
@DecimalMin(value=值) | 和@Min要求一样 | 验证注解的元素值大于等于@ DecimalMin指定的value值 |
@DecimalMax(value=值) | 和@Min要求一样 | 验证注解的元素值小于等于@ DecimalMax指定的value值 |
@Digits(integer=整数位数, fraction=小数位数) | 和@Min要求一样 | 验证注解的元素值的整数位数和小数位数上限 |
@Size(min=下限, max=上限) | 字符串、Collection、Map、数组等 | 验证注解的元素值的在min和max(包含)指定区间之内,如字符长度、集合大小 |
@Past | java.util.Date,java.util.Calendar;Joda Time类库的日期类型 | 验证注解的元素值(日期类型)比当前时间早 |
@Future | 与@Past要求一样 | 验证注解的元素值(日期类型)比当前时间晚 |
@NotBlank | CharSequence子类型 | 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的首位空格 |
@Length(min=下限, max=上限) | CharSequence子类型 | 验证注解的元素值长度在min和max区间内 |
@NotEmpty | CharSequence子类型、Collection、Map、数组 | 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) |
@Range(min=最小值, max=最大值) | BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子类型和包装类型 | 验证注解的元素值在最小值和最大值之间 |
@Email(regexp=正则表达式,flag=标志的模式) | CharSequence子类型(如String) | 验证注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式 |
@Pattern(regexp=正则表达式,flag=标志的模式) | String,任何CharSequence的子类型 | 验证注解的元素值与指定的正则表达式匹配 |
@Valid | 任何非原子类型 | 指定递归验证关联的对象如用户对象中有个地址对象属性,如果想在验证用户对象时一起验证地址对象的话,在地址对象上加@Valid注解即可级联验证 |
此处只列出Validator提供的大部分验证约束注解,请参考hibernate validator官方文档了解其他验证约束注解和进行自定义的验证约束注解定义。
四、使用 Validation API 进行参数效验步骤
整个过程如下图所示,用户访问接口,然后进行参数效验。 对于GET请求的参数可以使用@validated注解配合上面相应的注解进行校验或者按照原先if-else方式进行效验。而对于POST请求,大部分是以表单数据即以实体对象为参数,可以使用@Valid注解方式进行效验。如果效验通过,则进入业务逻辑,否则抛出异常,交由全局异常处理器进行处理。
五、 Spring Validation的三种校验方式
第一种:在Controller方法参数前加@Valid注解——校验不通过时直接抛异常,get请求直接在平面参数前添加相应的校验规则注解,使用这种的话一般结合统一异常处理进行处理;
第二种:在Controller方法参数前加@Valid注解,参数后面定义一个BindingResult类型参数——执行时会将校验结果放进bindingResult里面,用户自行判断并处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
这里我们是直接抛出了异常,如果没有进行全局异常处理的话,接口将会返回如下信息:
第三种:用户手动调用对应API执行校验——Validation.buildDefault ValidatorFactory().getValidator().validate(xxx)
这种方法适用于校验任意一个有valid注解的实体类,并不仅仅是只能校验接口中的参数;
这里我提取出一个工具类,如下:
MyValidationUtils.class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
五、springboot项目中实战演练
spring-boot-starter-web依赖已经集成相关jar,无需额外引入。
1.对实体类的变量进行注解标注
实体类中添加 @Valid 相关验证注解,并在注解中添加出错时的响应消息。
User.class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
如果是嵌套的实体对象,并且也要校验该对象,则需要在最外层属性上添加 @Valid
注解
UserInfo.class
1 2 3 4 5 6 7 8 9 10 11 |
|
2.创建自定义异常
自定义异常类,方便我们处理手动抛出的异常。
1 2 3 4 5 6 7 8 9 |
|
3.自定义响应枚举类
定义一个返回信息的枚举类,方便我们快速响应信息,不必每次都写返回消息和响应码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
4.自定义响应对象类
创建用于返回调用方的响应信息的实体类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
5.添加全局异常处理
全局异常用于处理校验不通过时抛出的异常,并通过接口返回,同时对其他未知异常进行处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
|
5.接口类中添加相关注解
处理get请求直接在参数前添加验证注解,处理post请求时在对象前添加@Valid注解
TestController.class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
|
6.进行测试
补充:使用自定义参数注解
1.我们这里创建一个身份证校验注解
1 2 3 4 5 6 7 8 9 10 11 12 |
|
这个注解是作用在Field字段上,运行时生效,触发的是IdentityCardNumber这个验证类。
- message 定制化的提示信息,主要是从ValidationMessages.properties里提取,也可以依据实际情况进行定制
- groups 这里主要进行将validator进行分类,不同的类group中会执行不同的validator操作
- payload 主要是针对bean的,使用不多。
2.自定义Validator
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
校验工具类IdCardValidatorUtils.class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 |
|
3. 使用自定义的注解
1 2 3 |
|
springboot使用Validation API和全局异常优雅的校验方法参数相关推荐
- springboot系列六、springboot配置错误页面及全局异常
springboot系列六.springboot配置错误页面及全局异常 参考文章: (1)springboot系列六.springboot配置错误页面及全局异常 (2)https://www.cnbl ...
- express捕获全局异常的三种方法
express捕获全局异常的三种方法 参考文章: (1)express捕获全局异常的三种方法 (2)https://www.cnblogs.com/chenqionghe/p/11349521.htm ...
- 如何优雅的处理异常?SpringBoot全局异常与数据校验
要思考的问题 在现在的前后端交互中,通常都规范了接口返回方式,如返回的接口状态(成功|失败)以及要返回的数据在那个字段取,或者说失败了以后提示信息从接口哪里返回,因此,如果想做全局异常,并且异常发生后 ...
- springboot 监听所有异常_SpringBoot 全局异常配置及返回自定义页面
1. 全局异常的配置 1. 创建异常处理类 package com.test.spring_boot_demo.domain; import org.slf4j.Logger; import org. ...
- bean validation校验方法参数_Spring Boot 之使用 validation 验证参数
前言 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206/six-finger种一棵树最好的时间是十年前,其次是现在 我知道很多人不玩qq了 ...
- bean validation校验方法参数_SpringBoot参数校验 从入门到精通 解决繁琐的参数验证工作...
● 手把手教你实现 SpringBoot与Vue整合开发 前后端分离 简单例子 详解●SQL优化经历 SQL执行效率提高了1000w倍●Java面试题 详解 由易到难● SQL语句大全详解 增删改查 ...
- bean validation校验方法参数_Spring Validation最佳实践及其实现原理,参数校验没那么简单!
本文同名博客老炮说Java:https://www.laopaojava.com/,每天更新Spring/SpringMvc/SpringBoot/实战项目等文章资料 顺便再给大家推荐一套Spring ...
- bean validation校验方法参数_项目启动时首先校验Spring Boot配置参数
1. 概述 在项目实际开发过程中,为了更好的复用,我们参考Spring Boot Starters,封装了许多企业内部中间件的starter.这些中间件的接入都需要申请并在项目中配置一些特定的参数.我 ...
- bean validation校验方法参数_Springboot 使用校验框架validation校验
作者:双斜杠少年 blog.csdn.net/u012373815/article/details/72049796 b/s系统中对http请求数据的校验多数在客户端进行,这也是出于简单及用户体验性上 ...
最新文章
- 大型网站架构不得不考虑的10个问题,互联网营销
- Eclipse VIM
- zookeeper配置中心
- ad09只在一定范围内查找相似对象_dxp查找相似对象
- win32api window2con 模块 -系统注册表操作
- 百度地图POI数据爬取,突破百度地图API爬取数目“400条“的限制11。
- python moviepy 音量_python moviepy 视频剪辑代码
- 304902阿里巴巴Java开发手册1.4.0
- php读取西门子plc_第三方设备如何读取PLC数据
- 录音文件下载_录音啦(文字语音转换)软件安装教程
- Intellij idea 最新版永久破解
- EXCEL 根据超链接直接显示图片
- 北大编程网格【练习题】,北医计算概论课程编程题答案整理,C语言/python/C++
- linux中sed如何替换换行符,linux sed命令,如何替换换行符“\n”
- W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x419b4c50)
- android查ip地址,安卓手机查看IP地址的两种方法, 二、进入手机状态
- linux发行版本排行,2020年10种最受欢迎的Linux发行版排名
- Android Pixel手机Notification小图标显示白方块问题
- SparkRDD——行动算子
- React的React.FC与React.Component的初步认识
热门文章
- 强化学习系列 - 刘建平Pinard
- vba 判断文本框内容是否为空_VBA代码解决方案第119讲:如何遍历工作表中的图形...
- Android应用在应用宝上线
- flash-热风焊盘的制作
- 苹果8p电池多少毫安的_给苹果8p用12w的充电器充电会怎么样?会不会对电池不好?-苹果...
- 如何短期通过PMP项目管理考试?
- 天载网上炒股数字经济超60万亿市场空间待启
- 快速存拷贝 fast_memcpy
- 为什么你的手机能上网打电话?
- 本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止