查看: 1280|回复: 1

SpringBoot统一参数校验

[复制链接]

3

主题

6

帖子

19

积分

个人用户

积分
19
发表于 2022-6-28 14:55:33 | 显示全部楼层 |阅读模式
简介: 在日常的开发中,**参数校验**是非常重要的一个环节,严格参数校验会减少很多出bug的概率,增加接口的安全性。也会减少对接时不必要的沟通。比如说:在对接的时候前端动不动就甩个截图过来说接口有问题,你检查了半天发现前端传递的参数有问题。针对以上:今天给大家分享一下**SpringBoot**如何实现统一参数校验。


前言
在日常的开发中,参数校验是非常重要的一个环节,严格参数校验会减少很多出bug的概率,增加接口的安全性。也会减少对接时不必要的沟通。比如说:在对接的时候前端动不动就甩个截图过来说接口有问题,你检查了半天发现前端传递的参数有问题。针对以上:今天给大家分享一下SpringBoot如何实现统一参数校验。

实现方式

使用 @Validated注解配合参数校验注解, 比如:@NotEmpty对参数进行校验。然后对抛出的异常ControllerAdvice进行捕获然后调整输出数据。


TestController
  1. @RestController
  2. public class TestController {

  3. /**
  4.      * 表单请求
  5.      * @param form 请求参数
  6.      * @return 响应数据
  7.      */
  8.     @PostMapping("/formRequest")
  9.     public ResultVo formRequest(@Validated RequestForm form){
  10.         return ResultVoUtil.success(form);
  11.     }

  12.     /**
  13.      * JSON请求
  14.      * @param form 请求参数
  15.      * @return 响应数据
  16.      */
  17.     @PostMapping("/jsonRequest")
  18.     public ResultVo jsonRequest(@RequestBody @Validated RequestForm form){
  19. return ResultVoUtil.success(form);
  20.     }

  21. }
复制代码

RequestForm

  1. @Data
  2. public class RequestForm {

  3.     @NotEmpty(message = "姓名不能为空")
  4.     private String name;

  5.     @Min(value = 1 , message = "年龄不能小于1岁")
  6.     private Integer age;

  7.     @NotEmpty(message = "性别不能为空")
  8.     private Integer sex;

  9. }
复制代码

测试结果


这个时候SpringBoot已经根据校验注解对参数进行校验了。并且输出了一大堆的错误信息。这个时候前端在对接的时候看到这样的错误信息,反手就是给你截个图告诉你接口有问题。所以这个时候就该使用 ControllerAdvice规范异常返回信息了。


ControllerAdvice
  1. @Slf4j
  2. @RestControllerAdvice
  3. public class ControllerAdvice {

  4.     /**
  5.      * 拦截表单参数校验
  6.      */
  7.     @ResponseStatus(HttpStatus.OK)
  8.     @ExceptionHandler({BindException.class})
  9.     public ResultVo bindException(BindException e) {
  10.         BindingResult bindingResult = e.getBindingResult();
  11.         return ResultVoUtil.error(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
  12.     }
  13.    
  14.     /**
  15.      * 拦截JSON参数校验
  16.      */
  17.     @ResponseStatus(HttpStatus.OK)
  18.     @ExceptionHandler(MethodArgumentNotValidException.class)
  19.     public ResultVo bindException(MethodArgumentNotValidException e) {
  20.         BindingResult bindingResult = e.getBindingResult();
  21.         return ResultVoUtil.error(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
  22.     }

  23. }
复制代码

@RestControllerAdvice会将返回的数据以json输出,如果不需要可以使用@ControllerAdvice

案例
  1. @Data
  2. public class ExampleForm {

  3.     @NotEmpty(message = "姓名不能为空")
  4.     @Length(min = 1 , max = 10 , message = "名字长度1~10")
  5.     private String name;

  6.     @Range(min = 1 , max = 99 , message = "年龄范围在1~99岁")
  7.     private Integer age;

  8.     @Pattern(regexp = "^[1][3,4,5,7,8][0-9]{9}$" , message = "电话号码有误")
  9.     private String phone;

  10.     @Email(message = "邮箱格式有误")
  11.     private String email;

  12.     @Valid
  13.     @Size(min = 1 ,max =  10 , message = "列表中的元素数量为1~10")
  14.     private List<RequestForm> requestFormList;

  15.     @Future(message = "开始时间必须大于当前时间")
  16.     private Date beginTime;
  17.    
  18. }
复制代码


实现嵌套验证
在实际的开发中,前台会后台传递一个list,我们不仅要限制每次请求list内的个数,同时还要对list内基本元素的属性值进行校验。这个时候就需要进行嵌套验证了,实现的方式很简单。在list上添加@Vaild就可以实现了。


  1. @Data
  2. public class JsonRequestForm {
  3.    
  4.     @Vaild
  5.     @Size(min = 1 ,max =  10 , message = "列表中的元素数量为1~10")
  6.     private List<RequestForm> requestFormList;
  7.    
  8. }
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

1

主题

3

帖子

11

积分

企业用户

积分
11
发表于 2022-6-28 14:58:56 | 显示全部楼层
写的很好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表