Spring Boot中全局异常处理器
文章目录
- 1.Spring Boot中两种异常处理方式
- 2.为什么需要全局异常处理呢?
- 3. 全局异常处理器
- 测试
- 4.@ControllerAdvice 详解
- 5.@ExceptionHandler 详解
1.Spring Boot中两种异常处理方式
要想解决测试中存在的问题,我们需要对程序中可能出现的异常进行捕获,通常有两种处理方式:
A. 在方法中加入 try…catch 进行异常捕获
形式如下:

如果采用这种方式,虽然可以解决,但是存在弊端,需要我们在保存其他业务数据时,也需要在其他方法中加上try…catch进行处理,代码冗余,不通用。
B. 使用异常处理器进行全局异常捕获
采用这种方式来实现,我们只需要在项目中定义一个通用的全局异常处理器,就可以解决本项目的所有异常。
2.为什么需要全局异常处理呢?
- 统一异常处理:全局异常处理器可以集中处理应用程序中的所有异常,避免在每个控制器或服务方法中都编写异常处理逻辑。这样可以减少代码冗余,提高代码的可维护性和可读性。
- 提高代码可靠性:通过全局异常处理,可以确保应用程序在发生异常时能够做出合适的响应,如返回友好的错误信息或页面,而不会因为异常而导致系统崩溃或提供错误的响应。
- 增强安全性:全局异常处理可以捕获并处理应用程序中的异常,防止恶意用户通过异常信息获取系统敏感信息或进行其他攻击。
- 提升用户体验:通过友好的错误信息或页面,向用户提供清晰的提示和指导,帮助用户更好地理解发生的问题,并提供解决方案,从而提升用户体验。
- 方便日志记录:全局异常处理器通常会记录异常信息,包括异常类型、发生时间、堆栈轨迹等,这些信息对于排查和解决问题非常有用。通过日志记录,可以及时发现并定位应用程序中的问题,提高系统的稳定性和可靠性。
3. 全局异常处理器
在项目中自定义一个全局异常处理器,在异常处理器上加上注解 @ControllerAdvice,可以通过属性annotations指定拦截哪一类的Controller方法。 并在异常处理器的方法上加上注解 @ExceptionHandler 来指定拦截的是那一类型的异常。
异常处理方法逻辑:
- 指定捕获的异常类型为 SQLIntegrityConstraintViolationException
- 解析异常的提示信息, 获取出是那个值违背了唯一约束
- 组装错误信息并返回

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.sql.SQLIntegrityConstraintViolationException;/*** 全局异常处理*/
@ControllerAdvice(annotations = {RestController.class, Controller.class})
@ResponseBody
@Slf4j
public class GlobalExceptionHandler {/*** 异常处理方法* @return*/@ExceptionHandler(SQLIntegrityConstraintViolationException.class)public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){log.error(ex.getMessage());if(ex.getMessage().contains("Duplicate entry")){String[] split = ex.getMessage().split(" ");String msg = split[2] + "已存在";return R.error(msg);}return R.error("未知错误");}
}
代码说明:
上述的全局异常处理器上使用了的两个注解 @ControllerAdvice , @ResponseBody , 他们的作用分别为:
@ControllerAdvice: 指定拦截那些类型的控制器;
@ResponseBody: 将方法的返回值 R 对象转换为json格式的数据, 响应给页面;
annotations属性指定只对带有@RestController或@Controller注解的类中的方法进行异常处理。
@ExceptionHandler(SQLIntegrityConstraintViolationException.class):使用@ExceptionHandler注解标识这是一个异常处理方法,处理SQLIntegrityConstraintViolationException异常。
测试
全局异常处理器编写完毕之后,我们需要将项目重启, 完毕之后直接访问管理系统首页, 点击 “员工管理” 页面中的 “添加员工” 按钮。当我们在测试中,添加用户时, 输入了一个已存在的用户名时,前端界面出现如下错误提示信息:

4.@ControllerAdvice 详解
- 作用范围:
@ControllerAdvice注解可以用于类级别,用于标记一个类为全局异常处理器。- 它也可以与
@RestController、@Controller注解一起使用,用于指定全局异常处理器只处理带有@RestController或@Controller注解的控制器类中抛出的异常。
- 异常处理:
- 通过在
@ControllerAdvice注解标记的类中定义异常处理方法,可以统一处理应用程序中的各种异常。 - 异常处理方法需要使用
@ExceptionHandler注解进行标记,以指定处理的异常类型。
- 通过在
- 作用域:
@ControllerAdvice注解可以限定作用的范围,即指定哪些控制器类的异常会被当前的全局异常处理器处理。- 可以通过
annotations、basePackages、basePackageClasses等属性来指定作用的范围。
- 其他用途:
- 除了处理异常之外,
@ControllerAdvice还可以用于其他方面,比如全局数据绑定、全局数据预处理等。
- 除了处理异常之外,
5.@ExceptionHandler 详解
- 用法:
@ExceptionHandler注解可以用于方法级别,用于标记一个方法为异常处理方法。- 异常处理方法需要定义在控制器类中,并且可以有任意的访问修饰符。
- 参数:
- 异常处理方法的参数可以是异常类型,也可以是其他类型的参数。
- 如果异常处理方法的参数是异常类型,则该方法只会处理指定类型的异常。
- 如果异常处理方法的参数是其他类型的参数,则该方法会处理所有类型的异常,并且异常对象会作为参数传递给方法。
- 异常处理逻辑:
- 异常处理方法可以编写任意的异常处理逻辑,比如记录日志、返回错误信息、执行特定的补救措施等。
- 在方法中可以通过异常对象来获取异常信息,如异常消息、堆栈轨迹等。
- 多个异常处理方法:
- 一个控制器类可以有多个异常处理方法,用来处理不同类型的异常。
- 当多个异常处理方法都能处理同一类型的异常时,Spring 框架会选择最匹配的异常处理方法来处理异常。
总的来说,@ExceptionHandler 注解提供了一种在控制器中处理异常的机制,能够根据不同类型的异常来执行不同的异常处理逻辑,使代码更加清晰和易于维护。
相关文章:
Spring Boot中全局异常处理器
文章目录 1.Spring Boot中两种异常处理方式2.为什么需要全局异常处理呢?3. 全局异常处理器测试4.ControllerAdvice 详解5.ExceptionHandler 详解 1.Spring Boot中两种异常处理方式 要想解决测试中存在的问题,我们需要对程序中可能出现的异常进行捕获&am…...
【JAVA重要知识 | 第七篇】Java异常知识总结(声明、抛出、捕获异常)
7.Java异常知识总结(声明、抛出、捕获异常) 7.1异常定义 在程序运行过程中,如果JVM检测出一个不可能执行的操作时,就会出现运行时错误(runtime error)。在Java中,运行时错误会作为异常抛出。异…...
SSM整合项目(Vue3环境搭建)
SSM整合项目(Vue3环境搭建) 1.下载node.js 1.卸载原来的node.js 2.检测是否卸载成功 3.下载node.js(10.16.3) 一路next就可以 4.检测是否安装成功 2.全局安装Vue插件cli 命令行输入 npm install -g vue/cli 3.新建Vue项目 1.…...
Golang 方法的接收器 receiver 指针和值的区别
一、如果receiver是指针类型 package mainimport "fmt"type Count struct {count int }func main() {c : Count{count: 0}c.incr()fmt.Println(c.count)c2 : &cc2.incr()fmt.Println(c2.count) }func (c *Count) incr() {c.count }//打印结果 1 2 incr 方法的 …...
【蓝桥杯】节省时间
一、对于string类型变量的连接,可以直接用“”或者“”来进行字符串的直接连接 string a"1"; string b"2"; string c; cab"12"; string操作符两边既可以都是string类型,也可是string与char类型 注意: (1)“”…...
矩阵乘法--Strassen算法
一、矩阵乘法 从中可以看出,计算两个矩阵的乘积,需要三个 for 循环,可以简单写出代码: for(int i1;i<m;i)for(int j1;j<p;j)for(int k1;k<n;k)c[i][j]a[i][k]*b[k][j]; 时间复杂度的分析:很明显,…...
Unity笔记:C#基础(1)
杂项 虚函数 CSDN - C虚函数详解 cnblog - C#中的虚函数virtual 常量池与new 在C#中,string是不可变的,这意味着对string对象的操作通常会返回一个新的string对象,而不会修改原始的string对象。因此,几乎所有涉及更改string内…...
计算机科技与心理学的紧密交织:一场跨学科的深度对话
随着信息技术的飞速发展,计算机科学与心理学这两门看似迥异的学科日益呈现出密不可分的关系。本文将深入探讨计算机科学与心理学之间的相互影响和融合,揭示二者在研究方法、应用实践以及对未来社会发展的影响等方面的高度关联性。 计算机科学为心理学研究…...
【JAVA类】利用接口的多继承实现———图书管理系统【附源码】
引言 在我们学习了一些java的基础语法之后,需要把这些知识点可以串起来,这里使用一个简单的小项目可以很好的帮助我们牢记这些知识点,今天就带大家学习一个有关java的小项目,很多学校也经常把这个项目作为他们的课程设计——经典的…...
Linux进程概念僵尸进程孤儿进程
文章目录 一、什么是进程二、进程的状态三、Linux是如何做的?3.1 R状态3.2 S状态3.3 D状态3.4 T状态3.5 t状态3.6 X状态3.7 Z状态 四、僵尸进程4.1 僵尸进程危害 五、孤儿进程 一、什么是进程 对于进程理解来说,在Windows上是也可以观察到的,…...
实体店如何引流成交裂变?打造流量新引擎的秘诀
在数字化浪潮席卷的今天,实体店经营面临着前所未有的挑战与机遇。社区店作为连接居民日常生活的桥梁,如何在激烈的市场竞争中脱颖而出,实现引流、成交与裂变,成为摆在每一位实体店创业者面前的重要课题。 作为一名鲜奶吧开店5年的…...
蓝桥杯(日期问题纯暴力)
纯纯暴力,写的想吐,玛德服了。 但是复习了vector去重方法,日期的合法性判断。 #include <iostream> #include <vector> #include <cstring> #include <algorithm>using namespace std; vector<int> res; st…...
ES: ES+Kibana 环境部署
ESKibana 部署 机器信息 10.10.8.62 10.10.8.63 10.10.8.64版本选择:6.8.1 基础环境优化 所有节点 # 关闭防火墙 systemctl stop firewalld.service systemctl disable firewalld.service# 查看selinux getenforce # 关闭selinux setenforce 0 # 永久关闭se…...
Find My产品越来越得到市场认可,伦茨科技ST17H6x芯片赋能厂家
苹果发布AirTag发布以来,大家都更加注重物品的防丢,苹果的 Find My 就可以查找 iPhone、Mac、AirPods、Apple Watch,如今的Find My已经不单单可以查找苹果的设备,随着第三方设备的加入,将丰富Find My Network的版图。产…...
Linux系统——Haproxy高性能负载均衡软件
目录 一、Haproxy介绍 1.Haproxy定义 2.Haproxy主要特性 二、安装Haproxy 1.yum安装 2.第三方rpm包安装 3.编译安装 3.1解决Lua环境 3.2编译安装Haproxy 三、配置文件详解 1.状态页 2.日志管理 2.1定义日志到其他主机站点 3.指定进程线程个数 4.cpu亲缘性 5.多进…...
Python办公自动化之PDF(二)
Python操作PDF二 1、PyMuPDF简介2、 1、PyMuPDF简介 PyMuPDF(也称Fitz)开源,提供了一整套用于处理PDF文件的综合工具。使用PyMuPDF,用户可以高效地执行打开PDF、提取文本、图像和表格、操作旋转和裁剪等页面属性、创建新PDF文档以…...
登录失败重试次数安全设计方案
1、登录失败重试次数设计方案 1、无论是账号还是密码错误,统一提示:用户名或密码错误,账号剩余登录次数N! 2、同一账号连续登录失败5次,锁定该账号5分钟,5分钟后可以再重试登录。 开发设计 keyÿ…...
Django——模板
Django——模板 Django 提供一种动态生成 HTML 页面 —— 模板 1、模板语言 模板语言(DTL): 变量 , 注释 , 标签 , 过滤器 , 模板继承 1、变量 <body> <!-- 这个是前端中的注释 --> {# 这种是Django中模板语言的…...
角蜥优化算法 (Horned Lizard Optimization Algorithm ,HLOA)求解无人机路径优化
一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径,使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一,它可以通过算法和模型来确定无人机的航迹,以避开障碍物、优化飞行时间和节省能量消耗。 二、算法介…...
Windows下 OracleXE_21 数据库的下载与安装
Oracle 数据库的下载与安装 数据库安装包下载数据库安装访问数据库进行测试Navicat连接数据库 1. 数据库安装包的下载 1.1 下载地址 Oracle Database Express Edition | Oracle 中国 1.2 点击“下载 Oracle Database XE”按钮,进去到下载页面(选择对…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...
