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

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用于校验字符串的值是否符合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的数据校验规范&#xff0c;它定义了一套用于校验Java Bean的API。它是JSR 303规范的一部分&#xff0c;也被称为Bean Validation。validation-api提供了一系列的注解&#xff0c;用于在Java类的…...

学习笔记 韩顺平 零基础30天学会Java(2024.8.8)

P492 第三代日期使用 P493 第三代日期方法 P495 String翻转 作业代码见chapter12homework 对于需要异常处理的情况&#xff0c;可以通过这种想法得到&#xff1a; P495 注册处理题 P496 字符串统计 P497 String内存布局测试题 P498 常见类阶段梳理 P499 集合介绍 集合的使用并不…...

45.跳跃游戏

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

Golang | Leetcode Golang题解之第328题奇偶链表

题目&#xff1a; 题解&#xff1a; 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&#xff1a;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 小功能:加载等待动画——转圈圈

加载等待动画实现——转圈圈 效果图&#xff1a;&#xff08;看封面最好&#xff09; 关键要点 流畅的动画&#xff1a; 使用 QTimer 每 50 毫秒更新一次动画&#xff0c;确保动画流畅。 视觉效果&#xff1a; 使用 QPainter 的平滑像素转换和抗锯齿选项&#xff0c;提高动画…...

【Linux进程篇】进程终章:POSIX信号量线程池线程安全的单例模式自旋锁读者写者问题

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 前言&#xff1a;在之前的进程间通信时我们就讲到过信号量&#xff0c;他的本质就是一个计数器&#xff0c;用来描述临界资源的一个计数器。我们当时使用电影院的例子来说明信号量。电影院的座位被我们称为临界资源&a…...

MathType7.5破解版下载安装激活图文详细教程(附激活秘钥)

&#x1f31f; 引言&#xff1a;揭秘MathType&#xff0c;数学编辑的瑞士军刀&#xff01; 嘿&#xff0c;各位小伙伴&#xff0c;今天我要给你们安利一个我超级喜欢的数学神器——MathType&#xff01;如果你跟我一样&#xff0c;在处理数学公式时常常感到头疼&#xff0c;那你…...

2-62 基于MATLAB gui 编制短波通信系统

基于MATLAB gui 编制短波通信系统&#xff0c;录制一段语音信号&#xff0c;分别通过AM SSB DSB 等调制信号&#xff0c;加入噪声&#xff0c;然后解调出来&#xff0c;可比较各种调制解调方式的优劣。程序已调通&#xff0c;可直接运行。 2-62 matlab gui - 小红书 (xiaohongs…...

windows C++-C++/WinRT 中创建组件和事件(下)

跨 ABI 的简单信号 如果无需连同事件传递任何形参或实参&#xff0c;则可以定义自己的简单 Windows 运行时委托类型。 以下示例展示 Thermometer 运行时类的更简易版本。 它声明名为 SignalDelegate 的委托类型&#xff0c;然后使用该类型来引发信号类型事件&#xff0c;而不是…...

C++初学者指南-5.标准库(第二部分)--二叉堆操作

C初学者指南-5.标准库(第二部分)–二叉堆操作 文章目录 C初学者指南-5.标准库(第二部分)--二叉堆操作背景什么是“堆”二叉最大堆二叉树的表示 堆操作C标准库中的堆初始化堆收缩堆增长堆 辅助操作sort_heap (Heap → Sorted Array)is_heapis_heap_until 相关内容 不熟悉 C 的标…...

在Ubuntu 16.04上安装Git的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 在现代软件开发中&#xff0c;一个不可或缺的工具是某种版本控制系统。版本控制系统允许您在源代码级别跟踪软件。您可以跟踪更改…...

redis内存淘汰策略-------Reservoir Sampling(水库采样)

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

C++《类和对象》(上)

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

LLM大语言模型算法特训

百度 LLM&#xff08;Large Language Model&#xff09;大语言模型算法特训是一个深度学习领域的高级培训项目&#xff0c;专门设计用于训练和优化大规模语言模型的开发者和研究人员。本文将详细探讨LLM算法的基本原理、训练技术、应用领域以及参与者可以预期的学习收获和挑战。…...

Docker相关笔记

Docker笔记 1. Dockerfile编译构建docker Dockerfile 是一个文本文件&#xff0c;包含了构建 Docker 镜像的所有指令。 Dockerfile 常用的有如下关键字&#xff1a; FROM&#xff1a;指定基础镜像&#xff0c;后续定制操作都是基于这个基础镜像&#xff0c;比如&#xff1a; …...

前端技术day01-HTML入门

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

Multisim 用LM358 运放模拟线性稳压器 - 运放输出饱和 - 前馈电容

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

宁德大屏第二版总结

碰到难点 1.wss 心跳机制 实现前端和后端双向绑定 只要后端发送了消息 前端通过全局总线去触发你想要的函数。 全局总线 vue3可以全局总线下一个mitt 新建一个eventBus.js import mitt from "mitt"; const eventBus mitt();export default eventBus; 然后wss…...

冥想第一千二百四十七天(1247)

1.今天上午带桐桐去游泳了&#xff0c;买了卡吉诺&#xff0c;吃过最好吃的甜点。推荐。还有鸡排。 2.回来后带着媳妇&#xff0c;先加油。去给丈母娘看腿&#xff0c;等丈母娘等了好久&#xff0c;还帮她推车。 3.回来后&#xff0c;在丈母娘家跑步。很舒服。家长麦田的香味。…...

C语言学习的第一周

1.自我介绍我姓马&#xff0c;来自成都的一个双非一本&#xff0c;目前大一&#xff0c;神秘专业&#xff0c;目前学c语言是兴趣使然和为了未来转码作铺垫&#xff0c;多项技能傍身也没错嘛2.学习目标打下c语言的坚实基础&#xff0c;方向初步是逐步从c语言到c再到更深度的知识…...

NPJ Precis Oncol 重庆大学附属肿瘤医院张久权教授团队:基于纵向MRI的分形分析预测乳腺癌新辅助化疗反应

01文献学习今天分享的文献是由重庆大学附属肿瘤医院张久权教授等团队于12月12日在肿瘤学顶刊《npj Precision Oncology》&#xff08;中科院1区top&#xff0c;IF8&#xff09;上发表的研究“Fractal analysis of longitudinal MRI for predicting response to neoadjuvant che…...

第三章:面向对象编程

第三章&#xff1a;面向对象编程 【免费下载链接】wereader 一个浏览器扩展&#xff1a;主要用于微信读书做笔记&#xff0c;对常使用 Markdown 做笔记的读者比较有帮助。 项目地址: https://gitcode.com/gh_mirrors/wer/wereader 3.1 类与对象 面向对象编程的核心是类和…...

EnCase vs FTK vs 取证大师:三大取证工具实战横评与选型指南(2024版)

EnCase vs FTK vs 取证大师&#xff1a;2024年电子取证工具深度横评与实战选型指南 当一起涉及企业数据泄露的案件摆在面前时&#xff0c;取证专家小李面对着三台装载不同软件的设备犹豫不决——EnCase的专业深度、FTK的全面覆盖&#xff0c;还是取证大师的本土化优势&#xf…...

如何让AirPods在Windows/Linux焕发新生:AirPodsDesktop的跨平台解放方案

如何让AirPods在Windows/Linux焕发新生&#xff1a;AirPodsDesktop的跨平台解放方案 【免费下载链接】AirPodsDesktop ☄️ AirPods desktop user experience enhancement program, for Windows and Linux (WIP) 项目地址: https://gitcode.com/gh_mirrors/ai/AirPodsDesktop…...

APSIM模型---农田管理优化、作物品种和株型筛选、农田固碳和温室气体排放等

随着数字农业和智慧农业的发展&#xff0c;基于过程的农业生产系统模型在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农田固碳和温室气体排放等领域扮演着越来越重要的作用。APSIM (Agricultural Production Systems sIMulator)模型是世界知名的作物生…...

别再死记硬背‘三层两网’了!用一张图看懂智能变电站的‘大脑’、‘神经’和‘手脚’

智能变电站解剖课&#xff1a;用人体系统秒懂"三层两网"架构 第一次走进智能变电站控制室时&#xff0c;那些闪烁的指示灯、跳动的数据曲线和密集的机柜总让人联想到科幻电影里的场景。但当你把整个系统想象成一个人的身体——大脑负责思考决策&#xff0c;神经系统…...

紧急预警:Mojo v1.1.3+ 版本Python插件存在ABI不兼容漏洞!立即执行这3条命令规避崩溃风险

第一章&#xff1a;紧急预警&#xff1a;Mojo v1.1.3 版本Python插件存在ABI不兼容漏洞&#xff01;立即执行这3条命令规避崩溃风险近期安全审计发现&#xff0c;Mojo 编译器 v1.1.3 及后续版本&#xff08;含 v1.1.4、v1.1.5&#xff09;中内置的 Python 插件&#xff08;mojo…...

Komikku与追踪器集成:如何实现与MyAnimeList、AniList的自动同步

Komikku与追踪器集成&#xff1a;如何实现与MyAnimeList、AniList的自动同步 【免费下载链接】komikku Free and open source manga reader for Android 项目地址: https://gitcode.com/gh_mirrors/ko/komikku Komikku是一款免费开源的Android漫画阅读应用&#xff0c;支…...

绝对能解决IntelliJ IDEA 控制台中文乱码问题!!!

绝对能解决IntelliJ IDEA 控制台中文乱码问题&#xff01;&#xff01;&#xff01; 1 idea 控制台中文乱码idea 运行代码&#xff0c;控制台的中文却是乱码&#xff0c;相信这个是所有 Javaer 都会遇到的问题&#xff0c;但是很惭愧&#xff0c;我工作 7 年才彻底解决这个问题…...