
 
文章目录
- 前言
- 引入Maven依赖
- 一、POST/PUT @RequestBody参数校验
- 1.1 Valid或Validated注解配合constraints注解
- 1.2 测试运行
 
- 二、GET/DELETE @RequestParam参数校验
- 2.1 Validated注解配合constraints注解
- 2.2 测试运行
 
- 三、GET 无注解参数校验
- 3.1 Valid或Validated注解配合constraints注解
- 3.2 测试运行
 
- 总结
- 最后
前言
先说下Spring Validation参数校验,它是前后端分离项目SpringBoot后端Controller层必做的工作之一,目的是防止非法调用,Java JSR303定义了校验标准validation-api,但没有实现,Hibernate validation是规范的实现,另外还增加了一些constraints注解,最后Spring Validation对Hibernate validation进行了二次封装,支持在SpringMvc中自动校验!
那么,在Restful风格流行的当下,在SpringBoot中,主流的参数校验场景包括:
- 对于POST、PUT请求,使用 @RequestBody传递的VO对象参数校验
- 对于GET、DELETE请求,使用 @RequestParam传递的url拼接参数校验
- 对于GET请求的无注解参数校验
接下来,我会图文结合带大家正确使用 @Valid、@Validated以及constraints相关注解,工作必用,实战必会,最后有总结,Let’s Go!
Java的标准定义的constraints注解位于:javax.validation.constraints
Hibernate validation增加的constraints注解位于:org.hibernate.validator.constraints
参数校验的绝配搭档:7.11 SpringBoot实战 全局异常处理 - 深入细节详解
引入Maven依赖
在springboot2.3之前,引入
spring-boot-starter-web时,自动引入validation依赖,但springboot2.3之后,需要单独引入依赖
spring-boot-starter-validation
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
一、POST/PUT @RequestBody参数校验
对于
POST、PUT请求,首选使用@RequestBody传递VO对象参数.
1.1 Valid或Validated注解配合constraints注解
以BookAdminController的saveBook为例:
- 在方法参数前加@Valid注解(换成@Validated注解也可以):

- 对BookVO对象的字段上加constraints注解,例如,对bookName加一个@NotNull注解

1.2 测试运行

入参未填bookName,会被参数校验异常的MethodArgumentNotValidException异常捕获,最后返回上图的结果~

二、GET/DELETE @RequestParam参数校验
对于
GET、DELETE请求,首选使用@RequestParam传递的url拼接参数。
2.1 Validated注解配合constraints注解
以BookAdminController的getBook为例:
这时,需要在Controller上加@Validated注解, 在方法参数前加constraints注解,以@Min注解为例:

2.2 测试运行

因为@Min限制了最小值为1,所以当入参使用id=0调用时,会被参数校验异常的ConstraintViolationException异常捕获:

三、GET 无注解参数校验
在@RequestParam前加
constraints注解的方式,参数少还可以用,参数多的时侯推荐封装成VO对象,调用方式依然不变~
3.1 Valid或Validated注解配合constraints注解
以BookAdminController的getBookCommentList为例,原来是这样写的:

现将参数封装成一个PageVO对象,并在字段上增加了constraints注解:@Min、@Max、@NotNull
@Data
public class PageVO implements Serializable {
    @Min(value = 1, message = "pageNum必须大于1")
    private Integer pageNum = 1;
    @Max(value = 100, message = "pageSize不能超过100")
    private Integer pageSize = 100;
    @Min(value = 1, message = "id必须大于1")
    @NotNull
    private Integer id;
}
这时,和@RequestBody参数校验加注解的方式相同,对方法参数加@Valid注解(换成@Validated注解也可以):

3.2 测试运行

因为@Max限制了pageSize最大值为100,所以当入参使用pageSize=1000调用时,会被参数校验异常的BindException异常捕获:

总结
- POST/PUT @RequestBody参数校验,在方法参数VO前加@Valid或@Validated,在VO字段上加constraints相关注解
- GET/DELETE @RequestParam参数校验,在Controller上加@Validated,在方法参数前加constraints相关注解
- GET 无注解参数校验,方法参数VO前加@Valid或@Validated,在VO字段上加constraints相关注解
对于constraints相关注解具体细节,我找了两篇供大家参考:
强悍的Spring之spring validation
Hibernate Validator详解
最后
看到这,觉得有帮助的,刷波666,感谢大家的支持~
想要看更多实战好文章,还是给大家推荐我的实战专栏–>《基于SpringBoot+SpringCloud+Vue前后端分离项目实战》,由我和 前端狗哥 合力打造的一款专栏,可以让你从0到1快速拥有企业级规范的项目实战经验!
具体的优势、规划、技术选型都可以在《开篇》试读!
订阅专栏后可以添加我的微信,我会为每一位用户进行针对性指导!
另外,别忘了关注我:天罡gg ,怕你找不到我,发布新文不容易错过: https://blog.csdn.net/scm_2008



















