在前后端分离的开发模式中,后端对前端传入的参数的校验成了必不可少的一个环节。但是在多参数的情况下,在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

SpringBoot整合Hibernate Validator实现参数验证功能的更多相关文章

  1. springboot使用hibernate validator校验

    一.参数校验 在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等,写这些与业务逻辑关系不大的代码个人感觉有两个麻烦: 验证代码繁琐,重复劳动 方法内代码显得冗长 每次要 ...

  2. springboot使用hibernate validator校验方式

    一.参数校验 在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等,写这些与业务逻辑关系不大的代码个人感觉有两个麻烦: 验证代码繁琐,重复劳动 方法内代码显得冗长 每次要 ...

  3. Spring Boot 整合Hibernate Validator

    Spring Boot 整合Hibernate Validator 依赖 <dependencies> <dependency> <groupId>org.spri ...

  4. springboot使用hibernate validator校验,Bean Validation校验

    第一个地址:springboot使用hibernate validator校验,Bean Validation校验

  5. SpringBoot 2 快速整合 | Hibernate Validator 数据校验

    概述 在开发RESTFull API 和普通的表单提交都需要对用户提交的数据进行校验,例如:用户姓名不能为空,年龄必须大于0 等等.这里我们主要说的是后台的校验,在 SpringBoot 中我们可以通 ...

  6. spring-boot 使用hibernate validation对参数进行优雅的校验

    springboot天生支持使用hibernate validation对参数的优雅校验,如果不使用它,只能对参数挨个进行如下方式的手工校验,不仅难看,使用起来还很不方便: if(StringUtil ...

  7. springBoot系列教程06:参数验证及验证信息国际化

    在springboot应用中要验证参数是否正确很简单,web应用已经包含了validation的 1.定义需要被验证的参数实体,并用注解标明错误类别和错误信息 package com.xiao.dom ...

  8. springboot使用hibernate validator

    前言 在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等,写这些与业务逻辑关系不大的代码个人感觉有两个麻烦: 验证代码繁琐,重复劳动 方法内代码显得冗长 每次要看哪些参 ...

  9. Hibernate Validator校验参数全攻略

    1. 前言 数据字段一般都要遵循业务要求和数据库设计,所以后端的参数校验是必须的,应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的. 2. 数据校验的痛点 为了保证数据语义的正确,我们 ...

随机推荐

  1. 【Mac】pip自定义源【永久有效】

    鉴于国内网络环境,pip安装比较慢已成为不争的事实,通过以下几步轻松解决 1.创建文件夹   mkdir -/.pip 2.创建配置文件  vim -/.pip/pip.conf mkdir ~/.p ...

  2. 【Mac】anaconda自定义channels

    1.查看channels conda config --show channels 输出 channels: - defaults 2.添加channels conda config --add ch ...

  3. Nginx 实现 HTTPS(基于 Let's Encrypt 的免费证书)

    SSL / TLS加密会为您的用户带来更高的搜索排名和更好的安全性. Let’s Encrypt 是一个认证机构(CA).它可以提供免费证书,并且已经被大多数浏览器所信任.另外,通过工具 Certbo ...

  4. JAVA自定义数据类型用法

    一,自定义数据类型的概念:    我们就拿一部手机进行分析,它能用来做什么呢?它可以打电话,上网,聊微信等,这些就是 手机所提供的功能,也就是方法:手机也有它的特征,如颜色.尺寸大小.品牌型号等,这些 ...

  5. 来自AI的Tips——情景智能

    来自AI的Tips--情景智能   上一次我们介绍了华为快服务智慧平台是什么,今天我们来侃一侃平台最有代表性的一个流量入口--情景智能(AI Tips).   首先情景智能在哪呢?大家可以拿出自己的华 ...

  6. CSS 伪选择器 focus-within 介绍

    CSS中的 :focus-within 伪选择器可有点"不寻常",尽管它的名称看上去很简单,而且相当直观.但它的解释是:选择一个包含具有:focus 的任何子元素的元素.有点绕是不 ...

  7. BUUCTF WEB

    BUUCTF 几道WEB题WP 今天做了几道Web题,记录一下,Web萌新写的不好,望大佬们见谅○| ̄|_ [RoarCTF 2019]Easy Calc 知识点:PHP的字符串解析特性 参考了一下网 ...

  8. Java实现 LeetCode 794 有效的井字游戏 (暴力分析)

    794. 有效的井字游戏 用字符串数组作为井字游戏的游戏板 board.当且仅当在井字游戏过程中,玩家有可能将字符放置成游戏板所显示的状态时,才返回 true. 该游戏板是一个 3 x 3 数组,由字 ...

  9. Java实现 LeetCode 203 移除链表元素

    203. 移除链表元素 删除链表中等于给定值 val 的所有节点. 示例: 输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2 ...

  10. java实现第三届蓝桥杯拼音字母

    拼音字母 在很多软件中,输入拼音的首写字母就可以快速定位到某个词条.比如,在铁路售票软件中,输入: "bj"就可以定位到"北京".怎样在自己的软件中实现这个功能 ...