文章目录
- 参考文章
前言
对于请求参数校验一直都是一个比较麻烦的问题,因为一旦请求中的参数有多个时,我们如果仅仅通过一个个进行判断就会造成代码冗余的问题,很不优雅。
解决:在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>
相关的注解有如下这些:
代码 | 说明 |
@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
*/
public class Test {
//其中message即为校验不通过时对应的描述信息
(message = "id不能为null")
private Integer id;
(min = 2, max = 5)
(message = "name不能为null")
private String name;
(value = 10000, message = "库存不能大于10000")
private Integer type;
}
2、全局捕捉+应用
实际应用:在controller的指定参数中添加@Valid
public class TestController {
//当对指定请求体实体类前标注@Valid,就会对该实体类的所有参数进行校验
("/test")
public ResultBody test( Test test){
return ResultBody.success(test);
}
}
那么我们如何拿到对应校验的结果呢?一般有两种方式
- 直接在后面跟着
BindingResult bindingResult
,接着即可拿到指定的校验结果,此时会进行下去。 - 通过全局异常捕捉,从异常类中获取到校验结果!(推荐)
我们来采用第二种方式来拿到校验结果并且进行同一返回响应!
/**
* @author Administrator
* @date 2021/07/22 17:27
**/
public class GlobalExceptionHandler {
/**
* 请求参数校验异常捕捉
* @param e
* @return
*/
(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());
}
}
说明:会对指定实体类中的所有参数都进行一一校验,并且我们可以通过异常拿到所有的校验结果!
测试
public class TestController {
("/test")
public ResultBody test( Test test){
return ResultBody.success(test);
}
}
我们可以看到返回得到了两条校验信息,说明所有的参数都是进行校验过的!
参考文章
[1]. springboot项目javax.validation使用
我是长路,感谢你的耐心阅读。如有问题请指出,我会积极采纳!
欢迎关注我的公众号【长路Java】,分享Java学习文章及相关资料
Q群:851968786 我们可以一起探讨学习
注明:转载可,需要附带上文章链接