当前位置: 首页 > 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

相关文章:

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

文章目录 概念基本概念常用校验注解 前置内容整合Hibernate Validator快速入门优雅处理参数校验异常其余注解校验自定义校验注解 参考来源 概念 基本概念 Hibernate Validator 是一个参数校验框架&#xff0c;可以非常方便地帮助我们校验应用程序的入参&#xff0c;实现了参数…...

Ubuntu系统中网易云音乐编译安装

项目地址&#xff1a; netease-cloud-music-gtk: Linux 平台下基于 Rust GTK 开发的网易云音乐播放器 目录 1.README.md中按照步骤来 2.安装git 3.报错 sudo apt install cmake sudo apt-get install libdbus-1-dev sudo apt install dnf sudo dnf install gettext 继…...

MPLS标签号

标签被压入在2层与3层之间 称为 2.5层 标签的格式----32 位4 个字节 前 20 位为标签号&#xff0c;2~20 个标签号&#xff1b;其中1-15号保留&#xff0c;作为特殊编号&#xff1b; 第 21-23位 exp&#xff0c;3位8个数&#xff0c;为优先级&#xff0c;用于Q0S 策略使用&a…...

OpenHarmony napi 编译 .so 并打包成 .har

一、前言 最近在搞公司标准产品适配OpenHarmony 平台&#xff0c; 按照行业上的常用方法&#xff0c;在Android 是将底层代码用c 封装成 xxx.so &#xff0c;然后将其他一部分打包成 xxx.jar。 因此&#xff0c;在OpenHarmony 平台也是打算按照这个模式。正所谓&#xff0c;好…...

python 循环导入(circular imports)解决方法

在 Python 中&#xff0c;大部分人都应该都遇到过循环导入的问题。 循环导入是指两个文件各自尝试导入另一个文件&#xff08;模块&#xff09;&#xff0c;当一个模块没有完全初始化时会导致失败。解决这种情况的最好方法是将代码分层组织&#xff0c;这样导入的关系就会自然…...

01、Linux网络设置

目录 1.1 查看及测试网络 1.1.1 查看网络配置 1、查看网络接口地址 2、查看主机状态 3、查看路由表条目 4、查看网络连接qing 1.1.2 测试网络连接 1.测试网络连接 2.跟踪数据包的路由路径 3.测试DNS域名解析 1.2 设置网络地址参数 1.2.1 使用网络配置命令 1.修改网卡…...

ssm160基于Java技术的会员制度管理的商品营销系统的设计与实现+vue

商品营销系统计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本商品营销系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理…...

边缘计算网关在智慧厕所远程监测与管理的应用

随着智慧城市建设的不断深入&#xff0c;城市公共设施的智慧化管理成为了提升城市品质和居民生活质量的关键建设。公厕作为城市基础设施的重要组成部分&#xff0c;其管理效率和卫生状况直接影响着市民的日常生活体验。在公厕设施建设背景下&#xff0c;边缘计算网关技术的应用…...

嵌入式linux中设备树使用of函数操作基本方法

各位开发者大家好,今天主要给大家分享一下,如何使用of操作函数,获取对应设备树节点先关的属性信息。 第一:of_find_property函数 of_find_property 函数用于在设备树中查找节点下具有指定名称的属性。如果找到了该属性,可以通过返回的属性结构体指针进行进一步的操作,比…...

10.GLM

智谱AI GLM 大模型家族 最强基座模型 GLM-130B GLM (General Language Model Pretraining with Autoregressive Blank Infilling) 基于自回归空白填充的通用语言模型&#xff08;GLM&#xff09;。GLM通过增加二维位置编码并允许以任意顺序预测跨度来改进空白填充预训练&…...

【深度学习】Transformer分类器,CICIDS2017,入侵检测,随机森林、RFE、全连接神经网络

文章目录 1 前言2 随机森林训练3 递归特征消除 RFE Recursive feature elimination4 DNN5 Transformer5.1. 输入嵌入层&#xff08;Input Embedding Layer&#xff09;5.2. 位置编码层&#xff08;Positional Encoding Layer&#xff09;5.3. Transformer编码器层&#xff08;T…...

pdf压缩到指定大小的简单方法

压缩PDF文件是许多人在日常工作和学习中经常需要面对的问题。PDF文件因其跨平台、易阅读的特性而广受欢迎&#xff0c;但有时候文件体积过大&#xff0c;会给传输和存储带来不便。因此&#xff0c;学会如何有效地压缩PDF文件&#xff0c;就显得尤为重要。本文将详细介绍几种常见…...

关于FPGA对 DDR4 (MT40A256M16)的读写控制 I

关于FPGA对 DDR4 &#xff08;MT40A256M16&#xff09;的读写控制 I 语言 &#xff1a;Verilg HDL EDA工具&#xff1a;ISE、Vivado 关于FPGA对 DDR4 &#xff08;MT40A256M16&#xff09;的读写控制 I一、引言二、DDR4的特性&#xff08;MT40A256M16&#xff09;&#xff08;1…...

JavaWeb_SpringBootWeb案例

环境搭建&#xff1a; 开发规范 接口风格-Restful&#xff1a; 统一响应结果-Result&#xff1a; 开发流程&#xff1a; 第一步应该根据需求定义表结构和定义接口文档 注意&#xff1a; 本文代码从上往下一直添加功能&#xff0c;后面的模块下的代码包括前面的模块&#xff0c…...

Linux中FTP安装

文章目录 一、FTP介绍1.1、FTP是什么1.2、FTP的工作原理1.3、FTP的传输模式1.4、FTP用户类别1.5、FTP的优点与缺点1.6、FTP数据传输格式 二、FTP客户端与服务端2.1、服务端2.2、客户端 三、FTP服务器软件介绍3.1、WU-FTPD3.2、ProFtpD3.3、vsftpd3.4、Pure-FTP3.5、FileZilla S…...

【Spring EL<二>✈️✈️ 】SL 表达式结合 AOP 注解实现鉴权

目录 &#x1f37b;前言 &#x1f378;一、鉴权&#xff08;Authorization&#xff09; &#x1f37a;二、功能实现 2.1 环境准备 2.2 代码实现 2.3 测试接口 &#x1f379;三、测试功能 3.1 传递 admin 请求 ​ 3.2 传递普通 user 请求 &#x1f37b;四、章末 &a…...

冯喜运:6.13美盘外汇黄金原油趋势分析及操作策略

【黄金消息面分析】&#xff1a;美国5月生产者价格指数&#xff08;PPI&#xff09;的意外下降&#xff0c;为市场带来了通胀可能见顶的积极信号。与此同时&#xff0c;初请失业金人数的上升&#xff0c;为劳动力市场的现状增添了一层不确定性。美国劳工统计局公布的数据显示&a…...

Lecture2——最优化问题建模

一&#xff0c;建模 1&#xff0c;重要性 实际上&#xff0c;我们并没有得到一个数学公式——通常问题是由某个领域的专家口头描述的。能够将问题转换成数学公式非常重要。建模并不是一件容易的事&#xff1a;有时&#xff0c;我们不仅想找到一个公式&#xff0c;还想找到一个…...

unidbg讲解V1

前言 unidbg是什么? unidbg是一个Java项目,可以帮助我们去模拟一个安卓或IOS设备,用于去执行so文件中的算法,从而不需要再去逆向他内部的算法。最终会产出一个jar包,可以被python进行调用。 如何使用unidbg? 下载github上开源的项目:https://github.com/zhkl0228/un…...

软设之敏捷方法

敏捷方法的总体目标是通过尽可能早地&#xff0c;持续地对有价值的软黏的交付&#xff0c;使客户满意 适用于&#xff1a;小步快跑的思想&#xff0c;适合小项目小团队 极限编程XP 4大价值观&#xff1a; 沟通 简单 反馈 勇气 5大原则 快速反馈 简单性假设 逐步修改…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

前端工具库lodash与lodash-es区别详解

lodash 和 lodash-es 是同一工具库的两个不同版本&#xff0c;核心功能完全一致&#xff0c;主要区别在于模块化格式和优化方式&#xff0c;适合不同的开发环境。以下是详细对比&#xff1a; 1. 模块化格式 lodash 使用 CommonJS 模块格式&#xff08;require/module.exports&a…...

精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑

精益数据分析&#xff08;98/126&#xff09;&#xff1a;电商转化率优化与网站性能的底层逻辑 在电子商务领域&#xff0c;转化率与网站性能是决定商业成败的核心指标。今天&#xff0c;我们将深入解析不同类型电商平台的转化率基准&#xff0c;探讨页面加载速度对用户行为的…...

RabbitMQ 各类交换机

为什么要用交换机&#xff1f; 交换机用来路由消息。如果直发队列&#xff0c;这个消息就被处理消失了&#xff0c;那别的队列也需要这个消息怎么办&#xff1f;那就要用到交换机 交换机类型 1&#xff0c;fanout&#xff1a;广播 特点 广播所有消息​​&#xff1a;将消息…...