文章目录

前言

对于请求参数校验一直都是一个比较麻烦的问题,因为一旦请求中的参数有多个时,我们如果仅仅通过一个个进行判断就会造成代码冗余的问题,很不优雅。

解决:在springboot中借助全局异常捕捉+validate注解校验就能够非常好的解决该问题!

所有博客文件目录索引:​​博客目录索引(持续更新)​




优雅入参校验

引入依赖

这是hibernate中的校验器,也可以用来作为传参时的校验:

<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<!-- 若是不引入下面依赖,校验就会无效,因为上面仅仅只是接口并不是实现 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.2.Final</version>
</dependency>

相关的注解有如下这些:

SpringBoot业务开发 05、SpringBoot优雅入参参数校验_后端

代码

说明

@Null

被注解的元素必须为null

@NotNull

被注解的元素必须不为null

@AssertTrue

被注解的元素必须为true

@AssertFalse

被注解的元素必须为false

@Min(value)

被注解的元素必须为数字,其值必须大于等于最小值

@Max(value)

被注解的元素必须为数字,其值必须小于等于最小值

@Size(max,min)

被注解的元素的大小必须在指定范围内

@Past

被注解的元素必须为过去的一个时间

@Future

被注解的元素必须为未来的一个时间

@Pattern

被注解的元素必须符合指定的正则表达式



1、编写请求实体类(使用如@NotNull等标注)

我们来比较常用的进行注解测试即可:

/**
* @ClassName Test
* @Author ChangLu
* @Date 2021/8/15 21:37
* @Description TODO
*/
@Data
public class Test {

//其中message即为校验不通过时对应的描述信息
@NotNull(message = "id不能为null")
private Integer id;

@Size(min = 2, max = 5)
@NotNull(message = "name不能为null")
private String name;

@Max(value = 10000, message = "库存不能大于10000")
private Integer type;

}




2、全局捕捉+应用

实际应用:在controller的指定参数中添加​​@Valid​

@RestController
public class TestController {

//当对指定请求体实体类前标注@Valid,就会对该实体类的所有参数进行校验
@GetMapping("/test")
public ResultBody test(@Valid @RequestBody Test test){
return ResultBody.success(test);
}

}

那么我们如何拿到对应校验的结果呢?一般有两种方式

  1. 直接在后面跟着​​BindingResult bindingResult​​,接着即可拿到指定的校验结果,此时会进行下去。
  2. 通过全局异常捕捉,从异常类中获取到校验结果!(推荐)

我们来采用第二种方式来拿到校验结果并且进行同一返回响应!

/**
* @author Administrator
* @date 2021/07/22 17:27
**/
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
/**
* 请求参数校验异常捕捉
* @param e
* @return
*/
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public ResultBody MethodArgumentNotValidHandler(MethodArgumentNotValidException e){
log.error("MethodArgumentNotValidException:",e);
return handleBindingResult(e);
}

public ResultBody handleBindingResult(BindingResult result){
ArrayList<String> list = new ArrayList<>();
if(result.hasErrors()){
//拿到所有的校验问题实体类
List<ObjectError> errors = result.getAllErrors();
for (ObjectError error : errors) {
list.add(error.getDefaultMessage());
}
}
if(list.size() == 0){
return ResultBody.error(CommonExceptionEnum.REQUEST_PARAM_ERROR); // REQUEST_PARAM_ERROR(2002,"请求参数有误"),
}
return ResultBody.error(CommonExceptionEnum.REQUEST_PARAM_ERROR.getResultCode(),list.toString());
}
}

说明:会对指定实体类中的所有参数都进行一一校验,并且我们可以通过异常拿到所有的校验结果!




测试

@RestController
public class TestController {

@GetMapping("/test")
public ResultBody test(@Valid @RequestBody Test test){
return ResultBody.success(test);
}

}

SpringBoot业务开发 05、SpringBoot优雅入参参数校验_实体类_02

我们可以看到返回得到了两条校验信息,说明所有的参数都是进行校验过的!




参考文章

[1]. ​​springboot项目javax.validation使用​




我是长路,感谢你的耐心阅读。如有问题请指出,我会积极采纳!
欢迎关注我的公众号【长路Java】,分享Java学习文章及相关资料
Q群:851968786 我们可以一起探讨学习
注明:转载可,需要附带上文章链接