优雅的springboot参数校验,你学会了吗?

前言在后端的接口开发过程,实际上每一个接口都或多或少有不同规则的参数校验,有一些是基础校验,如非空校验、长度校验、大小校验、格式校验;也有一些校验是业务校验,如学号不能重重复、手机号不能重复注册等;对于业务校验,是需要和数据库交互才能知道校验结果;对于参数的基础校验,是有一些共有特征可以抽象出来 , 可以做成一个通用模板(JAVA就是一种面向对象的编程语言,还记得天天快要说烂问烂的面向对象的三大特性吗?) 。基于实际场景的需要,java API中定义了一些Bean校验的规范标准(JSR303:validation-api) , 但是没有具体实现,不过hibernate validation和spring validation都提供了一些比较优秀的实现 。如果在项目里,你还是像类似这样的方式来进行参数校验就太low了,活该加班到天亮(当然如果你所在公司目前仍然用统计代码量来考核你的工作,就算我没说,你可以继续使用这种方式) 。
@PostMApping("/add")public String add(Student student) {if (null == student) {throw new RuntimeException("学生不为空");}if ("".equals(student.getStuCode())) {throw new RuntimeException("学号不能为空");}if ("".equals(student.getStuName())) {throw new RuntimeException("学生姓名不能为空");}if (null == student.getTeacher()) {throw new RuntimeException("学生的老师的不能为空");}if ("".equals(student.getTeacher().getTecName())) {throw new RuntimeException("学生的老师的姓名不能为空");}if ("".equals(student.getTeacher().getSubject())) {throw new RuntimeException("学生的老师的所授科目不为能空");}return "success";}依赖引入分享的这篇文章里的校验参数注解使用方法,我是在一个springboot项目里亲自重新测试验证过的 , springboot的版本是2.3.9.RELEASE,另外也引入了关于参数校验的starter包,这样就不用额外去引关于参数校验的其他包了;
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId><version>2.3.9.RELEASE</version></dependency>参数形式在java项目中,前端请求后端的接口中,常用的请求类型主要是post和get 。

  • 在POST请求中,通常使用requestBody传递参数,即前端以json报文的格式传递到后端controller层,spring会把json报文自动映射到@RequestBody修饰的形参实例;
  • 在GET请求中,通常使用requestParam/PathVariable传递参数,其中requestParam是指前端以key-value的形式把参数传递到后端 , spring会把参数自动映射到@RequestParam修饰的形参数实例对象(@RequestParam可以,也可以没有,只要参数key与controller层方法内形参类型的属性名称可以对应的上);@PathVariable是指spring可以将请求URL中占位符参数绑定到controller层方法的形参上;
常用到的约束注解 @Valid
被注释的元素是一个对象,需要检查此对象的所有字段值
@Null
被注释的元素必须为 null
@NotNull
被注释的元素必须不为 null
@AssertTrue
被注释的元素必须为 true
@AssertFalse
被注释的元素必须为 false
@Min(value)
被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)
被注释的元素必须是一个数字 , 其值必须小于等于指定的最大值
@DecimalMin(value)
被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)
被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max, min)
被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction)
被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past
被注释的元素必须是一个过去的日期
@Future
被注释的元素必须是一个将来的日期
@Pattern(value)
被注释的元素必须符合指定的正则表达式
Hibernate Validator 附加的 constrAInt


推荐阅读