在前后端分离的开发模式中,后端对前端传入的参数的校验成了必不可少的一个环节。但是在多参数的情况下,在controller层加上参数验证,会显得特别臃肿,并且会有许多的重复代码。这里可以引用Hibernate Validator来解决这个问题,直接在实体类进行参数校验,验证失败直接返回错误信息给前端,减少controller层的代码量。

一、xml引入Hibernate Validator

<!-- 验证器 -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.5.Final</version>
</dependency>

二、通过注解在实体类进行参数校验

@Data
public class UserModel { @NotNull(message = "用户名称不能为空!")
private String userName; @NotNull(message = "age不能为null!")
@Range(min = 1, max = 888, message = "范围为1至888")
private Integer age; /**
* 日期格式化转换
*/
@NotNull(message = "日期不能为null!")
private Date date;
}

这里用到的参数校验的注解有@NotNull和@Range,message是到时候我们返回给前端的信息,注解的具体意思如下:

@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) 被注释的元素必须符合指定的正则表达式。
@Email 被注释的元素必须是电子邮件地址
@Length 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串必须非空
@Range 被注释的元素必须在合适的范围内

三、controller层的方法加上@Valid注解

@PostMapping("/testPost")
public Object testPost(@RequestBody @Valid UserModel userModel, BindingResult result){
if(result.hasErrors()){
for(ObjectError error:result.getAllErrors()){
return error.getDefaultMessage();
}
}
return userModel;
}

controller层这里只需要在实体类的前面加上@Valid注解,这个注解可以实现数据的验证。这里BindingResult是存储了校验时的错误信息,验证有误时将错误信息返回给前端。这里不使用BindingResult的时候,控制台会报MethodArgumentNotValidException,这里可以通过自定义异常类来捕捉它,然后去掉BindingResult,以及难看的if判断。

四、自定义异常类捕捉MethodArgumentNotValidException

@RestControllerAdvice
public class GlobalExceptionAdvice { @ExceptionHandler(value = MethodArgumentNotValidException.class)
public JsonData validException(MethodArgumentNotValidException e) {
//验证post请求的参数合法性
MethodArgumentNotValidException notValidException = e;
String msg = notValidException.getBindingResult().getFieldError().getDefaultMessage();
return JsonData.buildError(msg);
}
}

使用PostMan的测试结果如下:

具体的代码可以在我的gitee上面查看,springboot_validator

最新文章

  1. Android手机相册的布局
  2. 刷LeetCode的正确姿势——第1、125题
  3. MYSQL远程登录权限设置 ,可以让Navicat远程连接服务器的数据库
  4. 打开gvim发现菜单栏是乱码
  5. Zero-Copy&amp;sendfile浅析
  6. yii2图片上传
  7. IOS之分析网易新闻存储数据(CoreData的使用,增删改查)
  8. jsp有关resquest与session和application的区别和相似性
  9. POJ1459 Power Network(网络最大流)
  10. Echarts通过Ajax实现动态数据加载
  11. 重复安装Lync导致发布拓扑失败
  12. linux下安装cmake和mysql遇到的问题总结
  13. SpringMVC RequestMapping 详解
  14. C++版 - 剑指offer 面试题22:栈的压入、弹出序列 题解
  15. .NET 配置文件实用指南
  16. 如何征服面试官,拿到Offer [转]
  17. 原子性 CAS算法
  18. Objective-C @executable_path、@loader_path和@rpath
  19. 不能用c99的情况下,如何动态定义数组的长度
  20. rem 响应 js函数

热门文章

  1. NodeJS——大汇总(一)(只需要使用这些东西,就能处理80%以上业务需求,全网最全node解决方案,吐血整理)
  2. PHP相关_几个操作记录下
  3. Python数据分析:pandas玩转Excel (一)
  4. LDA模型笔记
  5. 五、Spring Web应用程序构建
  6. 第一次写js轮播图
  7. python常见面试题讲解(十)数字颠倒
  8. Java实现 洛谷 P3916 图的遍历(反向DFS+记忆化搜索)
  9. Java实现 LeetCode 659 分割数组为连续子序列 (哈希)
  10. Java实现 LeetCode 638 大礼包(阅读理解题,DFS)