Spring Boot 如何做参数校验?

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

1、背景介绍


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


image.png


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


接下来,用Validation来改写这段。


2、Spring Boot文档中的Validation


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

image.png



其实,Spring Validator和Hibernate Validator是两套Validator,可以混着用,这里我们用Hibernate Validator。在Java技术栈微信公众号后台回复关键字:_boot_,可以获取更多栈长整理的 Spring Boot 系列技术干货。


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

image.png


5.2、定义一个对象

image.png


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

推荐阅读:参数验证 @Validated 和 @Valid 的区别。


image.png


注意:


默认情况下,如果校验失败会抛javax.validation.ConstraintViolationException异常,可以用统一异常处理去对这些异常做处理


An Errors/BindingResult argument is expected to be declared immediately after the model attribute


推荐阅读:参数验证 @Validated 和 @Valid 的区别。


5.4、看效果


image.png



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


image.png


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


5.5、自定义校验规则

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


image.png


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


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


image.png


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


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


下面重点看一下@CheckTimeInterval


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


image.png


第二步、定义Validator去校验它


image.png


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


image.pngimage.png



言归正传


第三步、验证


image.png





看,自定义的校验生效了。


6、补充


6.1、校验模式

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


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


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


image.png


6.2、单个参数校验

image.png






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


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




6.3、错误页面


image.png



以刚才优惠券详情为例


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


相关文章
|
2月前
|
前端开发 Java 数据库连接
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
|
7月前
|
Java Spring
SpringBoot 实战 不同参数调用不同实现
本文介绍了如何在实际工作中根据不同的入参调用不同的实现,采用`map+enum`的方式实现优雅且严谨的解决方案。通过Spring Boot框架中的工厂模式或策略模式,避免了使用冗长的`if...else...`语句。文中详细展示了定义接口、实现类、枚举类以及控制器调用的代码示例,确保用户输入的合法性并简化了代码逻辑。
198 1
SpringBoot 实战 不同参数调用不同实现
|
8月前
|
XML Java 应用服务中间件
Spring Boot 两种部署到服务器的方式
本文介绍了Spring Boot项目的两种部署方式:jar包和war包。Jar包方式使用内置Tomcat,只需配置JDK 1.8及以上环境,通过`nohup java -jar`命令后台运行,并开放服务器端口即可访问。War包则需将项目打包后放入外部Tomcat的webapps目录,修改启动类继承`SpringBootServletInitializer`并调整pom.xml中的打包类型为war,最后启动Tomcat访问应用。两者各有优劣,jar包更简单便捷,而war包适合传统部署场景。需要注意的是,war包部署时,内置Tomcat的端口配置不会生效。
2161 17
Spring Boot 两种部署到服务器的方式
|
6月前
|
Java 数据库 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——指定项目配置文件
在实际项目中,开发环境和生产环境的配置往往不同。为简化配置切换,可通过创建 `application-dev.yml` 和 `application-pro.yml` 分别管理开发与生产环境配置,如设置不同端口(8001/8002)。在 `application.yml` 中使用 `spring.profiles.active` 指定加载的配置文件,实现环境快速切换。本节还介绍了通过配置类读取参数的方法,适用于微服务场景,提升代码可维护性。课程源码可从 [Gitee](https://gitee.com/eson15/springboot_study) 下载。
231 0
|
11月前
|
JSON 前端开发 Java
Spring MVC——获取参数和响应
本文介绍了如何在Spring框架中通过不同的注解和方法获取URL参数、上传文件、处理cookie和session、以及响应不同类型的数据。具体内容包括使用`@PathVariable`获取URL中的参数,使用`MultipartFile`上传文件,通过`HttpServletRequest`和`@CookieValue`获取cookie,通过`HttpSession`和`@SessionAttribute`获取session,以及如何返回静态页面、HTML代码片段、JSON数据,并设置HTTP状态码和响应头。
202 1
Spring MVC——获取参数和响应
|
11月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
341 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
10月前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
539 2
|
11月前
|
JSON NoSQL Java
springBoot:jwt&redis&文件操作&常见请求错误代码&参数注解 (九)
该文档涵盖JWT(JSON Web Token)的组成、依赖、工具类创建及拦截器配置,并介绍了Redis的依赖配置与文件操作相关功能,包括文件上传、下载、删除及批量删除的方法。同时,文档还列举了常见的HTTP请求错误代码及其含义,并详细解释了@RequestParam与@PathVariable等参数注解的区别与用法。
110 2
|
11月前
|
前端开发 Java Spring
【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象
【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象
307 2
|
11月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
334 2