spring使用validation参数及全局异常检测
1.validation参数验证工具
1.1.validation-api技术链
validation-api是一个Java的数据校验规范,它定义了一套用于校验Java Bean的API。它是JSR 303规范的一部分,也被称为Bean Validation。validation-api提供了一系列的注解,用于在Java类的字段、方法参数和方法返回值上添加校验规则。这些注解包括@NotNull、@Size、@Min、@Max等等,每个注解都有特定的校验规则,用于验证数据是否满足特定的条件。
Hibernate Validator是validation-api的唯一实现。除了提供注解和校验规则,Hibernate Validator还提供了一系列的工具类和接口,用于处理校验结果和错误信息。它可以将校验结果封装为一个Validator对象,并提供了各种方法来获取校验结果、错误信息和错误类型。Hibernate Validator还支持国际化,可以根据不同的语言环境显示相应的错误信息。它还提供了可自定义的错误消息模板,可以根据实际需求来设置错误消息的格式和内容。
spring-boot-starter-validation是一个Spring Boot的starter,用于集成和简化Spring框架中的数据校验功能。spring-boot-starter-validation通过自动配置的方式,将Hibernate Validator集成到了Spring Boot的应用中,从而简化了数据校验的配置过程。通过引入这个starter,我们可以在应用中使用标准的注解来进行数据校验,而不需要手动配置和引入相关的依赖项。
1.2.validation常用注解
validation-api提供了一些常用的注解
@NotNull | 用于校验字段或方法参数的值不能为空 |
@NotEmpty | 用于校验字符串、集合或数组的值不能为空,且长度不能为0 |
@NotBlank | 用于校验字符串的值不能为空或只包含空格 |
@Size | 用于校验字符串、集合或数组的长度是否在指定范围内 |
@Min | 用于校验数字的值是否大于等于指定的最小值 |
@Pattern | 用于校验字符串的值是否匹配指定的正则表达式 |
用于校验字符串的值是否符合Email格式 | |
@DecimalMin | 用于校验数字的值是否大于等于指定的最小值,可以指定最小值的精度 |
Hibernate Validator 提供了一些拓展注解,用于在 validation-api 注解基础上实现更复杂的数据校验。以下是一些常见的 Hibernate Validator 拓展注解(部分)
@URL | 用于校验字符串的值是否符合 URL 地址格式 |
@CreditCardNumber | 用于校验信用卡号的格式是否正确 |
@Currency | 用于校验货币代码是否正确 |
@ISBN | 用于校验国际标准书号(ISBN)是否正确 |
@Range | 用于校验数字的值是否在指定范围内 |
1.3.代码示例
对于一个请求参数,根据需求进行注解申明
import jakarta.validation.constraints.DecimalMax;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Size;
import lombok.Data;@Data
public class ReqCreateCatalog {@NotEmptyprivate String gameId;@DecimalMin(value = "1")@DecimalMax(value = "2")private int type;//目标目录@Size(max = 50, message = "名称长度不能超过{max}个字符")private String catalog;
}
controller方法参数增加@Valid注解
@PostMapping(value = "/createCatalog")
public Response create(@Valid @RequestBody ReqCreateCatalog req) {}
如果请求故意把gameId参数设为空,
则程序输出异常日志
2. 全局异常处理器
2.1.使用@RestControllerAdvice拦截异常
上面的例子可以看出,当验证器抛出MethodArgumentNotValidException异常,如果没有一个全局异常捕获器对其进行捕获并进行转义,前端得到的响应很奇怪。
SpringMVC使用@RestControllerAdvice注解对全局异常进行拦截,例如下面的代码
(也可以使用@ControllerAdvice注解,但每个方法还需要添加@ResponseBody注解)
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(MethodArgumentNotValidException.class)public Response<Object> handleMethodArgumentNotValidException(MethodArgumentNotValidException e, HttpServletRequest request) {String requestURI = request.getRequestURI();log.error("请求地址'{}',参数校验失败'{}'", requestURI, e.getMessage());return Response.fail(I18nConstants.COMMON_ILLEGAL_PARAMS);}@ExceptionHandler(BusinessRequestException.class)public Response<Object> handleBusinessRequestException(BusinessRequestException e, HttpServletRequest request) {String requestURI = request.getRequestURI();log.error("请求地址'{}',权限码校验失败'{}'", requestURI, e.getMessage());return Response.fail(e.getErrorCode());}@ExceptionHandler(value = Exception.class)public Response<Object> handleException(Exception e, HttpServletRequest request) {LoggerUtil.error("", e);return Response.fail(I18nConstants.COMMON_INTERNAL_ERROR);}}
2.2.异常拦截方法有以下几个注意地方
- 方法名必须以handle开头;
- 需要添加@ExceptionHandler注解,注解的值是一个异常类数组,当value为空,则默认取方法的异常参数类型;
- 当程序触发了一个异常,如果在全局异常拦截器找不到映射,则会递归找它的父异常,则到父类Throwalbe为止;
- 如果多个@RestControllerAdvice示例绑定了同一个异常,程序不会报错,但只有一个拦截器起作用。
2.3.使用案例
使用全局异常拦截器,重新发起请求,可以看到客户端输出:
{"success": false,"message": 1003, //I18nConstants.COMMON_ILLEGAL_PARAMS"data": null
}
相关文章:

spring使用validation参数及全局异常检测
1.validation参数验证工具 1.1.validation-api技术链 validation-api是一个Java的数据校验规范,它定义了一套用于校验Java Bean的API。它是JSR 303规范的一部分,也被称为Bean Validation。validation-api提供了一系列的注解,用于在Java类的…...

学习笔记 韩顺平 零基础30天学会Java(2024.8.8)
P492 第三代日期使用 P493 第三代日期方法 P495 String翻转 作业代码见chapter12homework 对于需要异常处理的情况,可以通过这种想法得到: P495 注册处理题 P496 字符串统计 P497 String内存布局测试题 P498 常见类阶段梳理 P499 集合介绍 集合的使用并不…...

45.跳跃游戏
:双层for。复杂度n*n n class Solution {public int jump(int[] nums) {// 找到所有的条约方法,返回其中的最小次数// 从后向前,依次记录到最后的次数int n nums.length;if(n 1) return 0;// int[] temp new int[n];// temp[n-1] 0;fo…...

Golang | Leetcode Golang题解之第328题奇偶链表
题目: 题解: func oddEvenList(head *ListNode) *ListNode {if head nil {return head}evenHead : head.Nextodd : headeven : evenHeadfor even ! nil && even.Next ! nil {odd.Next even.Nextodd odd.Nexteven.Next odd.Nexteven even.N…...

【ARM】CMSIS 软件标准接口
目录 CMSIS:Cortex Microcontroller Software Interface Standard1. 概述2. CMSIS-Core2.1 概述2.2 关键组件2.3 示例代码2.4 详细解释 3. CMSIS-DSP3.1 概述3.2 关键组件3.3 示例代码3.4 详细解释 4. CMSIS-RTOS4.1 概述4.2 关键组件4.3 示例代码4.4 详细解释 5. C…...

Qt 小功能:加载等待动画——转圈圈
加载等待动画实现——转圈圈 效果图:(看封面最好) 关键要点 流畅的动画: 使用 QTimer 每 50 毫秒更新一次动画,确保动画流畅。 视觉效果: 使用 QPainter 的平滑像素转换和抗锯齿选项,提高动画…...

【Linux进程篇】进程终章:POSIX信号量线程池线程安全的单例模式自旋锁读者写者问题
W...Y的主页 😊 代码仓库分享 💕 前言:在之前的进程间通信时我们就讲到过信号量,他的本质就是一个计数器,用来描述临界资源的一个计数器。我们当时使用电影院的例子来说明信号量。电影院的座位被我们称为临界资源&a…...

MathType7.5破解版下载安装激活图文详细教程(附激活秘钥)
🌟 引言:揭秘MathType,数学编辑的瑞士军刀! 嘿,各位小伙伴,今天我要给你们安利一个我超级喜欢的数学神器——MathType!如果你跟我一样,在处理数学公式时常常感到头疼,那你…...

2-62 基于MATLAB gui 编制短波通信系统
基于MATLAB gui 编制短波通信系统,录制一段语音信号,分别通过AM SSB DSB 等调制信号,加入噪声,然后解调出来,可比较各种调制解调方式的优劣。程序已调通,可直接运行。 2-62 matlab gui - 小红书 (xiaohongs…...
windows C++-C++/WinRT 中创建组件和事件(下)
跨 ABI 的简单信号 如果无需连同事件传递任何形参或实参,则可以定义自己的简单 Windows 运行时委托类型。 以下示例展示 Thermometer 运行时类的更简易版本。 它声明名为 SignalDelegate 的委托类型,然后使用该类型来引发信号类型事件,而不是…...

C++初学者指南-5.标准库(第二部分)--二叉堆操作
C初学者指南-5.标准库(第二部分)–二叉堆操作 文章目录 C初学者指南-5.标准库(第二部分)--二叉堆操作背景什么是“堆”二叉最大堆二叉树的表示 堆操作C标准库中的堆初始化堆收缩堆增长堆 辅助操作sort_heap (Heap → Sorted Array)is_heapis_heap_until 相关内容 不熟悉 C 的标…...
在Ubuntu 16.04上安装Git的方法
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 在现代软件开发中,一个不可或缺的工具是某种版本控制系统。版本控制系统允许您在源代码级别跟踪软件。您可以跟踪更改…...

redis内存淘汰策略-------Reservoir Sampling(水库采样)
文章目录 过期删除策略和内存淘汰策略内存淘汰策略evictionPoolEntryevictionPoolPopulate Reservoir SamplingdictGetRandomKeydictGetSomeKeysReservoir Samplingchatgpt对Reservoir Sampling的介绍 过期删除策略和内存淘汰策略 详细介绍请参考博客“redis过期删除策略和内存…...

C++《类和对象》(上)
在之前的C入门基础知识中我们了解了C的发展过程已经重要性,还初步了解了C中一些相比C语言特有的知识点,例如命名空间、缺少参数、函数重载、引用等,接下来在本篇中我们将开始C整个体系中非常重要的一个知识章节——类和对象,类和对…...

LLM大语言模型算法特训
百度 LLM(Large Language Model)大语言模型算法特训是一个深度学习领域的高级培训项目,专门设计用于训练和优化大规模语言模型的开发者和研究人员。本文将详细探讨LLM算法的基本原理、训练技术、应用领域以及参与者可以预期的学习收获和挑战。…...
Docker相关笔记
Docker笔记 1. Dockerfile编译构建docker Dockerfile 是一个文本文件,包含了构建 Docker 镜像的所有指令。 Dockerfile 常用的有如下关键字: FROM:指定基础镜像,后续定制操作都是基于这个基础镜像,比如: …...

前端技术day01-HTML入门
一、前端介绍 技术描述HTML用于构建网站的基础结构的CSS用于美化页面的,作用和化妆或者整容作用一样JS实现网页和用户的交互Vue主要用于将数据填充到html页面上的Element主要提供了一些非常美观的组件 二、工具软件 VsCode 在前端领域,有一个公认好用…...

Multisim 用LM358 运放模拟线性稳压器 - 运放输出饱和 - 前馈电容
就是拿运放搭一个可调的LDO 稳压器,类似下面这个功能框图里的感觉。本来应该非常简单,没什么好说的,没想到遇到了两个问题。 原理 - 理想运放 我用PNP 三极管Q2 作为输出,运放输出电压升高时,流过PNP 三极管BE 的电流变…...

宁德大屏第二版总结
碰到难点 1.wss 心跳机制 实现前端和后端双向绑定 只要后端发送了消息 前端通过全局总线去触发你想要的函数。 全局总线 vue3可以全局总线下一个mitt 新建一个eventBus.js import mitt from "mitt"; const eventBus mitt();export default eventBus; 然后wss…...
冥想第一千二百四十七天(1247)
1.今天上午带桐桐去游泳了,买了卡吉诺,吃过最好吃的甜点。推荐。还有鸡排。 2.回来后带着媳妇,先加油。去给丈母娘看腿,等丈母娘等了好久,还帮她推车。 3.回来后,在丈母娘家跑步。很舒服。家长麦田的香味。…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...