当前位置: 首页 > news >正文

Spring Boot整合hibernate-validator实现数据校验

文章目录

  • 概念
    • 基本概念
    • 常用校验注解
  • 前置内容
  • 整合Hibernate Validator
    • 快速入门
    • 优雅处理参数校验异常
    • 其余注解校验
    • 自定义校验注解
  • 参考来源

概念

基本概念

Hibernate Validator 是一个参数校验框架,可以非常方便地帮助我们校验应用程序的入参,实现了参数校验与业务开发的解耦

常用校验注解

  • @Validated
    通常作用于Controller的方法的对象参数上,标识该对象需要做参数校验
  • @Valid
    与@Validated注解功能类似,但它还可作用于要校验的对象参数的引用类型属性上,从而实现嵌套校验(即对要校验的对象参数的引用类型属性的属性做参数校验)
  • @NotNull
    非空校验,但校验字符串时空字符串可验证通过
  • @NotEmpty
    非空校验,但校验字符串时纯空格字符串可验证通过
  • @NotBlank
    非空校验,校验字符串时纯空格字符串不可验证通过
  • @Min
    整数最小值校验
  • @Max
    整数最大值校验
  • @Size
    字符串、集合、数组长度校验
  • @Email
    邮箱格式校验
  • @Pattern
    使用正则表达式校验参数

前置内容

本教程基于Spring Boot快速整合Spring MVC和Mybatis-Plus,实现基本的增删改查功能这篇文章,请读者先阅读这篇文章

整合Hibernate Validator

快速入门

  • 引入maven依赖
        <!--   Hibernate Validator参数校验     --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>
  • 在User类的nickname属性加上@NotBlank
    @NotBlank(message = "昵称不能为空")private String nickname;
  • 添加用户接口使用@valid注解
    @PostMapping("/addUser")@ApiOperation(value = "添加用户")public boolean addUser(@RequestBody @Valid User user) {return userService.save(user);}
  • 重启并使用Knife4j测试添加用户接口在这里插入图片描述在这里插入图片描述

如下图,控制台报了MethodArgumentNotValidException异常,并且响应提示也不友好,接下来我们需要全局处理一下该异常,让前端的提示更加友好

优雅处理参数校验异常

  • 创建参数校验异常提示类
@Data
public class ValidErrorInfo {private String field;private String errMsg;
}
  • 创建全局异常处理器
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {/*** 参数校验异常处理** @param e* @return*/@ExceptionHandler(MethodArgumentNotValidException.class)  // 指定要处理的异常public List<ValidErrorInfo> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {// 打印异常信息log.error("参数校验异常", e);// 封装异常结果List<ValidErrorInfo> errs = new ArrayList<>();BindingResult bindingResult = e.getBindingResult();List<FieldError> fieldErrors = bindingResult.getFieldErrors();fieldErrors.forEach(err -> {ValidErrorInfo validErrorInfo = new ValidErrorInfo();validErrorInfo.setField(err.getField());validErrorInfo.setErrMsg(err.getDefaultMessage());errs.add(validErrorInfo);});return errs;}}
  • 重启并使用Knife4j测试添加用户接口

响应结果输出了友好提示
在这里插入图片描述

其余注解校验

  • 在User类的pwd属性加上@Size校验密码长度
    @Size(min = 8, max = 16)private String pwd;
  • 在User类的email属性加上@Email校验邮箱格式
    @Emailprivate String email;
  • 在User类的phone属性加上@Pattern校验手机号格式
    @Pattern(regexp = "1([345789])\\d{9}")private String phone;
  • 重启项目测试
    在这里插入图片描述
  • 其余注解请自行测试

自定义校验注解

如果现有的校验注解不能满足我们的需求,我们可以自定义校验注解,比如我们自定义一个性别校验注解

  • 创建一个性别校验器
public class GenderValidValidator implements ConstraintValidator<GenderValid, String> {@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {List<String> genders = Arrays.asList("男", "女");return genders.contains(value);}
}
  • 创建一个校验性别的校验注解
@Documented
@Constraint(validatedBy = {GenderValidValidator.class})  // 指定校验器
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
public @interface GenderValid {String message() default "性别录入必须为:男/女";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}
  • 在User类的gender属性加上 @GenderValid校验性别
  • 重启项目测试
    在这里插入图片描述

参考来源

  • spring 官网
  • hibernate-validator
http://www.lryc.cn/news/371552.html

相关文章:

  • Ubuntu系统中网易云音乐编译安装
  • MPLS标签号
  • OpenHarmony napi 编译 .so 并打包成 .har
  • python 循环导入(circular imports)解决方法
  • 01、Linux网络设置
  • ssm160基于Java技术的会员制度管理的商品营销系统的设计与实现+vue
  • 边缘计算网关在智慧厕所远程监测与管理的应用
  • 嵌入式linux中设备树使用of函数操作基本方法
  • 10.GLM
  • 【深度学习】Transformer分类器,CICIDS2017,入侵检测,随机森林、RFE、全连接神经网络
  • pdf压缩到指定大小的简单方法
  • 关于FPGA对 DDR4 (MT40A256M16)的读写控制 I
  • JavaWeb_SpringBootWeb案例
  • Linux中FTP安装
  • 【Spring EL<二>✈️✈️ 】SL 表达式结合 AOP 注解实现鉴权
  • 冯喜运:6.13美盘外汇黄金原油趋势分析及操作策略
  • Lecture2——最优化问题建模
  • unidbg讲解V1
  • 软设之敏捷方法
  • 【设计模式深度剖析】【7】【行为型】【观察者模式】
  • 列表的C++实
  • Chisel入门——在windows系统下部署Chisel环境并点亮FPGA小灯等实验
  • Python和C++赋值共享内存、Python函数传址传值、一些其他的遇到的bug
  • 深度解析ONLYOFFICE协作空间2.5版本新功能
  • Java I/O模型
  • 【简单介绍下Sass,什么是Sass?】
  • bat脚本—快速修改网络配置
  • node.js漏洞——
  • Qt多线程之moveToThread()函数
  • 【WEB前端2024】智体OS:poplang编程控制成本小千元的长续航robot机器人底盘(开源)