当前位置: 首页 >文章 > SpringBoot开发秘籍 - 集成参数校验及高阶技巧
收藏
分享

SpringBoot开发秘籍 - 集成参数校验及高阶技巧

举报小虎转载君小虎转载君发布于 2021-05-18812阅读0点赞
默认情况下在对参数进行校验时Spring Validation会校验完所有字段然后才抛出异常,可以通过配置开启 Fali Fast模式,一旦校验失败就立即返回。...

对于 web服务来说,为防止非法参数对业务造成影响,在 Controller层一定要对参数进行校验!本章我们以SpringBoot项目为例,介绍参数校验的基本用法以及一些高级技巧,希望能对你有所帮助。

简单使用


要在Springboot项目中加入参数校验功能首先得加入spring-boot-starter-validation依赖


然后给需要校验的字段添加上约束性注解,如我们对实体类参数进行校验

常见约束注解如下:

注:此表格只是简单的对注解功能的说明,并没有对每一个注解的属性进行说明;可详见源码。

3.在Controller层对需要参数校验的方法加上@Validated注解

参数校验一般分为两类:在Controller使用模型接收数据时, @Validated注解直接放在该模型参数前即可。


当我们是直接在Controller层中的参数前,使用约束注解时,@Validated要直接放在类上

此时需要在主类上增加@Validated注解


在参数校验时我们既可以使用@Validated也可以使用@Valid注解,两者功能大部分类似;
主要区别在于:

@Valid属于javax下的,而@Validated属于spring下;

@Valid支持嵌套校验、而@Validated不支持,@Validated支持分组,而@Valid不支持。

统一异常处理


如果参数校验未通过Spring会抛出三种类型的异常

1.当对@RequestBody需要的参数进行校验时会出现org.springframework.web.bind.MethodArgumentNotValidException

2.当直接校验具体参数时会出现javax.validation.ConstraintViolationException,也属于ValidationException异常
3.当直接校验对象时会出现org.springframework.validation.BindException

在SpringBoot中统一拦截处理只需要在配置类上添加 @RestControllerAdvice注解,然后在具体方法中通过 @ExceptionHandler指定需要处理的异常,具体代码如下:

最终实现效果如下:


参数分组


有下面一个实体类,我们需要对其进行参数校验。


但是实际业务是在编辑的时候 appId才是必填,在新增的时候 name必填,这时候可以用groups分组功能来实现:同一个模型在不同场景下,动态区分校验模型中的不同字段。

使用方式
1.首先我们定义一个分组接口ValidGroup,再在分组接口总定义出多个不同的操作类型,Create,Update,Query,Delete


这里的 ValidGroup继承了Default,当然也可以不继承,具体区别我们后面再说。

2.在模型中给校验参数分配分组

tips:这里@Email注解未指定分组,默认会属于Default分组,appId和name指定了分组就不会再属于Default分组了。

3.在参数校验时通过value属性指定分组

这里通过 @Validated(value = ValidGroup.Crud.Update.class)指定了具体的分组,上面提到的是否继承Default的区别在于:

如果继承了Default,@Validated标注的注解也会校验未指定分组或者Default分组的参数,比如email
如果不继承Default则不会校验未指定分组的参数,需要加上@Validated(value = {ValidGroup.Crud.Update.class, Default.class}才会校验

快速失败(Fali Fast)


默认情况下在对参数进行校验时Spring Validation会校验完所有字段然后才抛出异常,可以通过配置开启 Fali Fast模式,一旦校验失败就立即返回。



本文原创,未经作者允许不可转载!
更多内容,欢迎关注作者微信公众号: JAVA日知录!


0条评论
别默默看啦~登录/注册一起参与讨论吧~

暂无评论

请选择举报理由

违反法律法规

侵犯个人权益

有害网站环境

更多训练营>>

为你推荐 · 训练营(全勤打卡报名费全额返累计全额返用户133,673人)

电商海报设计训练营
距离开班仅剩6天73人已报名
【5月】零基础手绘插画训练营
距离开班仅剩6天69人已报名
【5月】零基础动态表情包创作训练营
距离开班仅剩23天16人已报名
猜你喜欢
JavaScript - parseFloat

2021-06-02

李游Leo 发表

JavaScript - parseFloat
高效使用内存,这些你得知道

2021-03-31

小虎转载君 发表

高效使用内存,这些你得知道
为什么甲方不喜欢极简主义

2021-05-19

王M争 发表

为什么甲方不喜欢极简主义
集群多JVM分布式锁实现

2020-07-12

小虎转载君 发表

集群多JVM分布式锁实现
一文读懂MySQL查询语句的执行过程

2021-05-05

小虎转载君 发表

一文读懂MySQL查询语句的执行过程
特惠
充值
7折购
今日还在继续学习的你,太棒了!
7
折扣券可用于
年费无限VIP
立 即
使 用
此活动优惠不可与其他活动叠加使用
有效期:000000
消息
登录即可查看消息记录
建议
意见
官方
客服
在线咨询客服热线

您可以与在线客服进行沟通获得帮助

工作日:9:00~22:00节假日:9:00~18:00

联系在线客服

您可以电话联系客服进行沟通获得帮助

工作日:9:30~18:30

400-862-9191
虎课
积分
免费学习89000+个教程!
配套素材、源文件一键下载!
昨日学员已学习了29,770
并提交了155份作业!
登录后立即学习!
loading
微信扫码关注即可登录
您需要同意协议才可以进行登录
登录虎课网,每天免费学课程全站 89000+ 视频会员教程 | 每日可免费学 1
为确保账户信息安全
请先进行真实姓名验证后进行充值付款
立即验证