最近因为某些原因, 需要对原来项目中通过注解实现的参数校验进行升级. 改为使用分组进行校验, 区分增删改查. 去网上看了一下, 结果发现相关文章大都是简单提一下, 实际使用中出现的参数失效的问题反而很多. 而且本来还打算将本文名称改成
SpringBoot参数校验各种失效情景及解决
, 但思考后发现失效的问题较多, 无法一一列举. 所以决定还是将SpringBoot参数校验的各种正确使用方式系统的总结一下, 以供后续自己和他人使用.
SpringBoot参数校验网上已经有很多了, 我这里不详细说明了. 就简单介绍下两注意三步骤
注意:
大致的使用步骤有三个步骤:
pom文件中加入相关启动器
请求实体对应属性上面加注解 & controller上加相关注解(主要是@Validated
)
全局异常处理
本文主要介绍post请求时, 入参为下图参数类型时的参数校验方式. 而get请求, 则只需保证在 controller上加
@Validated
并在入参前加入对应的用于校验的注解即可.
在控制类上加@Validated
创建四个用于分组校验时使用的接口类
需要简单说明一下使用分组校验的原理: 就是在校验参数时, 我们希望有些参数仅在指定的操作中生效(例如增改).
我们就可以通过对应属性校验注解的groups
参数指定参数校验生效的范围, 值为上面的接口(可以为多个).
然后在controller层通过@Validated(value = InsertDO.class)
来定义当前属于哪种操作并和请求实体中定义的范围进行比对.
属于对应范围后才会进行参数校验. 具体请求方式的校验步骤请见下面的介绍:
请求实体
groups
可以定义校验生效的范围, 表示在操作下用于参数校验的注解才会生效.
接口方法
@Validated
的value
属性可以指定当前属于哪种操作, 用于和请求实体中生效的范围进行比较, 属于生效范围中才会进行参数校验
无参请求 因为使用的基本上都是判空校验的注解, 所以使用无参和实参进行请求, 通过返回信息来判断是否生效
实参请求
ps: 验证controller方法中@Validated
的值为请求实体中groups
属性范围外的值时, 是否生效
修改controller方法中@Validated
注解中value
属性的值
通过postman可以看到, 在指定范围外的分组进行校验时, 无参请求, 接口也正常调用, 所以参数校验注解没有生效
请求实体 同一个参数校验注解分组和不分组时不能同时混用, 不分组时需要去掉groups参数相关内容. controller方法中请求实体前使用未分组的注解, 但请求实体具体属性上注解使用分组属性时, 则参数校验不生效 因此建议使用同一个请求实体时不要同时出现这两种方式, 否则可能会出现滥用导致的注解失效的问题.
接口方法
需要注意: 虽然controller类上面已经有@Validated
, 但请求实体旁还是需要有, 否则不会生效
无参请求
实参请求
本来由普通实体,分组 + List集合,不分组可以推得该部分, 但是由于两个注解不会同时生效(如下代码). 因此想要实现此效果需要自己自定义注解 (后续有时间的话会出专门的文章给出具体实现步骤)
请求实体
controller方法
无参请求
带参请求
请求实体
这里一定要对嵌套实体的属性加上@Valid
, 用于对被嵌套的实体类进行校验
可以加@NotNull
, 用于嵌套实体为null时的提示, 否则不会提示
嵌套实体
通过groups
指定生效的范围
controller方法
同普通实体分组一样, 分组. @Validated
的value
属性可以对请求实体或者嵌套实体中规定的范围进行比对
传入嵌套实体, 传入指定参数, 但传入不合规的值
传入嵌套实体, 传入指定参数, 传入合规的值
请求实体
这里一定要对嵌套实体对应属性加上@Valid
, 用于对被嵌套的实体类进行校验
建议可以追加@NotNull
注解, 用于嵌套属性为null时的消息提示,
否则嵌套属性不传时, 则不会对嵌套属性和其对应的嵌套实体内的属性进行校验.
嵌套实体 可以加入需要进行校验的属性
controller方法 这里同普通实体, 不分组的书写方式
没有传入嵌套实体时请求接口
传入嵌套实体, 但不传指定参数时
传入嵌套实体, 传入指定参数
传入嵌套实体, 传入按照要求的指定参数
get请求很简单, 只需要在controller方法上加上@Validated
, 在指定参数前加上校验注解即可
post请求常用参数校验方式总结
参考: https://blog.csdn.net/Zong_0915/article/details/126649671 https://blog.csdn.net/sun_mu_one/article/details/122056101 https://zhuanlan.zhihu.com/p/646379747