Spring Boot 参数校验的具体实现方式
1、背景介绍
开发过程中,后台的参数校验是必不可少的,所以经常会看到类似下面这样的代码
这样写并没有什么错,还挺工整的,只是看起来不是很优雅而已。
接下来,用validation来改写这段
2、spring boot文档中的validation
在spring boot的官网中,关于validation只是简单的提了一句,如下
其实,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
5.2、定义一个对象
5.3、适用@valid校验,并将校验结果放到bindingresult对象中
注意:
默认情况下,如果校验失败会抛javax.validation.constraintviolationexception异常,可以用统一异常处理去对这些异常做处理an errors/bindingresult argument is expected to be declared immediately after the model attribute5.4、看效果
如果在校验的对象后面再加上model对象的话,如果返回的是modelandview就可以将这个model设置到其中,这样在页面就可以取到错误消息了
仅仅只是单字段校验的话未免也太不灵活了吧,如果字段之间有关联关系,那该如何校验呢?答案是自定义
5.5、自定义校验规则
这里,以优惠券创建为例来演示如何自定义校验规则
首先,优惠券表单如下(仅仅只是演示用):
这里除了自定义了两条校验规则之外,还用到了分组。
为什么要有分组这一说呢?因为,举个例子,添加的时候不需要校验id,而修改的时候id不能为空,有了分组以后,就可以添加的时候校验用组a,修改的时候校验用组b
下面重点看一下@checktimeinterval
第一步、定义一个注解叫checktimeinterval
第二步、定义validator去校验它
顺便提一句,这里beanwrapper去取对象的属性值,我们稍微看一下beanwrapper是做什么的
言归正传
第三步、验证
看,自定义的校验生效了
6、补充
6.1、校验模式
https://docs.jboss.org/hibernate/stable/validator/reference/en-us/html_single/#section-fail-fast
下面补充一点,关于校验模式
默认会校验完所有属性,然后将错误信息一起返回,但很多时候不需要这样,一个校验失败了,其它就不必校验了
为此,需要这样设置
6.2、单个参数校验
如果是调整页面的时候参数校验失败的话,这时可以不做处理,让其调到错误页面。
如果是接口参数校验失败的话,可以在这里进行统一处理,并返回。例如:
6.3、错误页面
以刚才优惠券详情为例
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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
Spring Boot 参数校验的具体实现方式
-
详解在Spring-Boot中实现通用Auth认证的几种方式
-
详解在Spring-Boot中实现通用Auth认证的几种方式
-
Spring Boot集成spring-boot-devtools开发时实现热部署的方式
-
Spring boot POST/GET请求的参数校验
-
Spring Boot集成spring-boot-devtools开发时实现热部署的方式
-
Spring Boot实现通用的接口参数校验
-
spring boot+自定义 AOP 实现全局校验的实例代码
-
Spring boot进行参数校验的方法实例详解
-
详解Spring Boot 中实现定时任务的两种方式