一文带你快速入手 Spring Boot 参数校验

程序员知识码头

共 2420字,需浏览 5分钟

 · 2019-12-19

0d6d6078cf4cc75d1d44e14726e99912.webp

08cbc9beb3e294929b244803d6379092.webp

作者:狂乱的贵公子 

来源:cnblogs.com/cjsblog/p/8946768.html


  • 1、背景介绍
  • 2、Spring Boot文档中的Validation
  • 3、Hibernate Validator
  • 4、Spring Validator
  • 5、示例
  • 6、补充
  • 参考

1、背景介绍

开发过程中,后台的参数校验是必不可少的,所以经常会看到类似下面这样的代码

9c170dfcab77f2f1ce24a7dbd37e367a.webp

这样写并没有什么错,还挺工整的,只是看起来不是很优雅而已。

接下来,用Validation来改写这段

2、Spring Boot文档中的Validation

Spring Boot的官网中,关于Validation只是简单的提了一句,如下

58f8cb231b16e07d7dfb2110b3fc68fb.webp

其实,Spring Validator 和**Hibernate Validator** 是两套Validator,可以混着用,这里我们用**Hibernate Validator**

3、Hibernate Validator

https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#preface

4、Spring Validator

https://docs.spring.io/spring/docs/5.0.5.RELEASE/spring-framework-reference/core.html#validation

5、示例

5.1、引入spring-boot-starter-validation

0b1e73bfe7c44d1e48bb06f2a4191641.webp

5.2、定义一个对象

5ef7df5f2068b25a12071a80ef6f0628.webp

5.3、适用@Valid校验,并将校验结果放到BindingResult对象中

80098f38fa59aa8daae249314ec0a657.webp

注意:

  • 默认情况下,如果校验失败会抛javax.validation.ConstraintViolationException异常,可以用统一异常处理去对这些异常做处理
  • An Errors/BindingResult argument is expected to be declared immediately after the model attribute

5.4、看效果

bd814694c5a63517ad57637701802716.webp07322e6e2ad31964818a715394fe9952.webp

如果在校验的对象后面再加上Model对象的话,如果返回的是ModelAndView就可以将这个Model设置到其中,这样在页面就可以取到错误消息了

cece676f6325150c64b63fc2e804e5b4.webp

仅仅只是单字段校验的话未免也太不灵活了吧,如果字段之间有关联关系,那该如何校验呢?答案是自定义

5.5、自定义校验规则

https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#validator-customconstraints

5f5021c2d4bf508f89801acb1fa810e0.webp

这里,以优惠券创建为例来演示如何自定义校验规则

首先,优惠券表单如下(仅仅只是演示用):

b5fb021feec83a423db4e1fcb44535ed.webp

这里除了自定义了两条校验规则之外,还用到了分组。

为什么要有分组这一说呢?因为,举个例子,添加的时候不需要校验id,而修改的时候id不能为空,有了分组以后,就可以添加的时候校验用组A,修改的时候校验用组B

下面重点看一下@CheckTimeInterval

第一步 、定义一个注解叫CheckTimeInterval

c68764f24f3c4cf92f3d51cef469ce87.webp

第二步 、定义Validator去校验它

6efa5ad67a8f08ffa7e10fbc655adaa5.webp

顺便提一句,这里BeanWrapper去取对象的属性值,我们稍微看一下BeanWrapper是做什么的

a77bfc459ea7ce21e99a19c1b6e437d4.webp7882a18df55a777d6524d4bd5aa08f73.webp

言归正传

第三步 、验证

8e6b5c5cbf4035f60f68315f2cd98500.webp09ff2582b4c3e4a3d43cf7686e33c527.webp9228a87ac7c31299a9164ba08fc6a647.webp

看,自定义的校验生效了

6、补充

6.1、校验模式

https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#section-fail-fast

下面补充一点,关于校验模式

默认会校验完所有属性,然后将错误信息一起返回,但很多时候不需要这样,一个校验失败了,其它就不必校验了

为此,需要这样设置

4e202f9c9694ddae126331d614c9c617.webp

6.2、单个参数校验

80221b82633554f137b6bf7259d34a7b.webpf1b2f17cf522547129c77391a45b9792.webpb51aa33596dcfec1dfbde56797702b8c.webp

如果是调整页面的时候参数校验失败的话,这时可以不做处理,让其调到错误页面。

如果是接口参数校验失败的话,可以在这里进行统一处理,并返回。例如:

14e63d641ba17ce195afe848ef703347.webp

6.3、错误页面

6bb5f27c84b4b15163187a211019e6da.webpa5a520f921b92d0d2084aee09ab4855c.webp

以刚才优惠券详情为例

http://localhost:8080/coupon/detail.html      400

http://localhost:8080/coupon/detail.html?id=    400

http://localhost:8080/coupon/detail.html?id=abc   400

http://localhost:8080/coupon/detail222.html?id=123  404

无权限  403

int a = 1 / 0;  500

6.4、@Valid与@Validated

https://blog.csdn.net/qq_27680317/article/details/79970590

参考

http://rensanning.iteye.com/blog/2357373

https://blog.csdn.net/kenight/article/details/77774465

https://www.cnblogs.com/mr-yang-localhost/p/7812038.html

https://www.phpsong.com/3567.html

https://www.cnblogs.com/mr-yang-localhost/p/7812038.html


- End -

a58bf512829d5431e2e803e68cd5444d.webp


Maven系列教程  点击--> Maven技术干货连载目录 跳转


MyBatis系列教程  点击--> MyBatis技术干货连载目录 跳转


JVM调优总结系列教程  点击--> JVM调优技术干货连载目录 跳转





, e9abb2f542c3f59f346dc9b22a254112.webp

浏览 18
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报