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

如何在Spring MVC中使用@ControllerAdvice创建全局异常处理器

文章目录

  • 前言
  • 一、认识注解:@RestControllerAdvice和@ExceptionHandler
  • 二、使用步骤
    • 1、封装统一返回结果类
    • 2、自定义异常类封装
    • 3、定义全局异常处理类
    • 4、测试
  • 总结


前言

全局异常处理器是一种 🌟✨机制,用于处理应用程序中发生的异常,无论这些异常在哪个部分发生。它可以拦截和处理整个应用程序范围内的异常,从而实现统一的异常处理逻辑。😊
在一个应用程序中,可能会有多个控制器处理不同的请求。当这些控制器中抛出异常时,可以使用全局异常处理器来捕获和处理这些异常,而不是在每个控制器中单独处理。⚡💪
全局异常处理器通常在应用程序的顶层进行定义,以确保能够拦截所有的异常。它可以捕获和处理各种类型的异常,包括应用程序自定义的异常、系统异常和未处理的异常。🎯🔍
使用全局异常处理器的好处包括:💡🎉
统一异常处理:全局异常处理器可以集中处理所有控制器中出现的异常,避免重复的异常处理代码,提高代码的可维护性和复用性。🙌
自定义异常响应:通过全局异常处理器,可以定义统一的异常响应格式和错误码,使异常的处理更加符合应用的需求。💼📊
防止泄露敏感信息:全局异常处理器可以捕获并处理未处理的异常,确保不会向客户端返回敏感信息,同时返回适当的异常信息。🔒🙅‍♂️
在Spring MVC中,可以使用@ControllerAdvice或@RestControllerAdvice注解来定义全局异常处理器类,并使用 @ExceptionHandler注解来定义处理特定异常的方法。这些方法可以在全局异常处理器类中进行集中管理,提供统一的异常处理逻辑。📚💻
希望这样的回答给你带来了一些乐趣和激励!如果你有其他问题,我会很乐意回答。😊🌈


一、认识注解:@RestControllerAdvice和@ExceptionHandler

当涉及到全局异常处理时,两个重要的注解被广泛使用:@RestControllerAdvice和@ExceptionHandler。
下面是对这两个注解的解释:
@RestControllerAdvice:
(这里插一句:如果你的应用程序使用传统的Web应用程序架构(使用视图解析器渲染视图),则可以使用@ControllerAdvice。而如果你的应用程序是RESTful风格的应用程序,需要直接返回JSON或其他格式的响应体,那么可以使用@RestControllerAdvice。)
@RestControllerAdvice是一个用于定义全局异常处理器的注解。通过将此注解应用于一个类上,该类可以成为一个全局异常处理器。在这个处理器中,你可以定义通用的异常处理逻辑,用于捕获和处理应用程序中的各种异常情况。
@RestControllerAdvice注解的主要作用是:
提供全局异常处理逻辑,捕获应用程序中未被处理的异常。
允许在多个控制器类中共享相同的异常处理逻辑。
可以组合使用其他注解,如@ExceptionHandler、@InitBinder和@ModelAttribute。
@ExceptionHandler:
@ExceptionHandler是一个用于定义特定异常处理方法的注解。通过将此注解应用于处理器类中的方法上,该方法可以被用于处理特定类型的异常。这样,当应用程序抛出匹配的异常时,该方法将被自动调用以处理该异常。
@ExceptionHandler注解的主要作用是:
定义特定异常的处理逻辑,捕获应用程序中抛出的特定类型的异常。
提供更精细的异常处理机制,根据不同的异常类型执行不同的处理代码。
可以在同一个全局异常处理器类中定义多个@ExceptionHandler方法,以处理不同类型的异常。

二、使用步骤

1、封装统一返回结果类

定义返回结果类:后端统一返回结果:


import lombok.Data;import java.io.Serializable;/*** 后端统一返回结果* @param <T>*/
@Data
public class Result<T> implements Serializable {private Integer code; //编码:1成功,0和其它数字为失败private String msg; //错误信息private T data; //数据public static <T> Result<T> success() {Result<T> result = new Result<T>();result.code = 1;return result;}public static <T> Result<T> success(T object) {Result<T> result = new Result<T>();result.data = object;result.code = 1;return result;}public static <T> Result<T> error(String msg) {Result result = new Result();result.msg = msg;result.code = 0;return result;}}

2、自定义异常类封装

封装自定义异常类,用于自定义异常抛出,根据实际情况对业务异常进行更细致和明确的拓展
先定义基础异常类:

/*** 业务异常*/
public class BaseException extends RuntimeException {public BaseException() {}public BaseException(String msg) {super(msg);}}

再定义自定义异常类:


public class UserNotLoginException extends BaseException {public UserNotLoginException() {}public UserNotLoginException(String msg) {super(msg);}}

3、定义全局异常处理类

统一捕获异常:


import com.example.result.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;@RestControllerAdvice
public class GlobalExceptionHandler {/*** 捕获业务异常*/@ExceptionHandlerpublic Result<?> exceptionHandler(BaseException ex){return Result.error(ex.getMessage());}/*** 捕获除数为0异常*/@ExceptionHandlerpublic Result<?> exceptionHandler(ArithmeticException ex){return Result.error("分母不能为0");}/*** 根据异常类型和业务需求,以以下格式继续完善代码*/
}

根据异常类型和业务需求,可以以以下格式继续完善代码:

 @ExceptionHandlerpublic Result<?> exceptionHandler(异常类型 ex){return Result.error("异常类型信息");}

4、测试

import com.example.result.Result;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class webTest {/*** 测试捕获业务异常*/@GetMapping("/aa/{id}")public Result<?> aa(@PathVariable Long id){if(id<2)throw new UserNotLoginException("密码错误");return Result.success("成功");}/*** 测试捕获除数为0异常*/@GetMapping("/bb")public Result<?> bb(){int a = 1/0;return Result.success("成功");}

在这里插入图片描述
在这里插入图片描述
通过以上测试,产生的异常都被全局异常处理器捕获了!!搞定!!!

总结

@作者:加辣椒了吗?
简介:憨批大学生一枚,喜欢在博客上记录自己的学习心得,也希望能够帮助到你们!
在这里插入图片描述

相关文章:

如何在Spring MVC中使用@ControllerAdvice创建全局异常处理器

文章目录 前言一、认识注解&#xff1a;RestControllerAdvice和ExceptionHandler二、使用步骤1、封装统一返回结果类2、自定义异常类封装3、定义全局异常处理类4、测试 总结 前言 全局异常处理器是一种 &#x1f31f;✨机制&#xff0c;用于处理应用程序中发生的异常&#xff…...

2023/08/05【网络课程总结】

1. 查看git拉取记录 git reflog --dateiso|grep pull2. TCP/IP和OSI七层参考模型 3. DNS域名解析 4. 预检请求OPTIONS 5. 渲染进程的回流(reflow)和重绘(repaint) 6. V8解析JavaScript 7. CDN负载均衡的简单理解 8. 重学Ajax 重学Ajax满神 9. 对于XML的理解 大白话叙述XML是…...

log_softmax比softmax更好?

多类别分类的一个trick 探讨一下在多类别分类场景&#xff0c;如翻译、生成、目标检测等场景下&#xff0c;使用log_softmax的效果优于softmax的原因。 假设词典大小为10&#xff0c;一个词的ID为9&#xff08;即词典的最后一个词&#xff09;&#xff0c;使用交叉熵作为损失函…...

[LeetCode - Python]344.反转字符串(Easy);345. 反转字符串中的元音字母(Easy);977. 有序数组的平方(Easy)

1.题目 344.反转字符串(Easy) 1.代码 class Solution:def reverseString(self, s: List[str]) -> None:"""Do not return anything, modify s in-place instead."""# 双指针left,right 0, len(s)-1while left < right:temp s[left]s[…...

【SOP】最佳实践之 TiDB 业务写变慢分析

作者&#xff1a; 李文杰_Jellybean 原文来源&#xff1a; https://tidb.net/blog/d3d4465f 前言 在日常业务使用或运维管理 TiDB 的过程中&#xff0c;每个开发人员或数据库管理员都或多或少遇到过 SQL 变慢的问题。这类问题大部分情况下都具有一定的规律可循&#xff0c;…...

带有参数的 PL/SQL 过程/函数从选择查询返回表

技术标签: 【中文标题】带有参数的 PL/SQL 过程/函数从选择查询返回表【英文标题】&#xff1a;PL/SQL Procedure/function with params to return a table from(of) a select query【发布时间】&#xff1a;2020-12-01 11:17:49【问题描述】&#xff1a; 如何创建带参数的 (…...

文件的权限

1、修改文件的所属者和所属组 2、修改文件某一类人&#xff08;所属者、所属组、其他人&#xff09;的权限 一、用户对于普通文件的权限 二、用户对于目录文件的权限 三、访问控制列表ACL 四、特殊权限&#xff08;了解&#xff09; wuneng创建了几个文件&#xff0c;xiaoming对…...

vue3集成echarts最佳实践

安装 echarts npm install echarts --save 两种引用方式 非虚拟 dom import * as echarts from echarts;var chartDom document.getElementById(mychart); var myChart echarts.init(chartDom); var option;option {title: {text: Referer of a Website,subtext: Fake Da…...

一位年薪40W的测试被开除,回怼的一番话,令人沉思

一位年薪40W测试工程师被开除回怼道&#xff1a;“反正我有技术&#xff0c;在哪不一样” 一技傍身&#xff0c;万事不愁&#xff0c;当我们掌握了一技之长后&#xff0c;在职场上说话就硬气了许多&#xff0c;不用担心被炒&#xff0c;反过来还可以炒了老板&#xff0c;这一点…...

网络适配器和MAC地址

点对点信道&#xff1a;由于目的地只有一个选项&#xff0c;所以数据链路层不需要使用地址。 而在广播信道中&#xff1a; 各个主机如何判断信号是不是发给自己的&#xff1f; 当多个主机连接在同一个广播信道上&#xff0c;要想实现两个主机之间的通信&#xff0c;则每个主机都…...

react-player静音不能自动播放问题

现象 移动端不能自动播放 原因 取决于您使用的浏览器&#xff0c;但muted如果您不想与autoplay用户交互&#xff0c;则必须使用视频。 Chrome 的自动播放策略很简单&#xff1a; 始终允许静音自动播放。在以下情况下允许自动播放声音&#xff1a; 用户与域进行了交互&#x…...

培训Java技术要多久才能学会?答案都在这里啦

培训Java技术要多久才能学会?这是想学习Java开发的很多人都会问到的一个问题。而这个问题的答案其实并不是那么简单&#xff0c;因为学Java的时间长短受到众多因素的影响。本文将从个人基础、学习动力和学习效率三个方面来为您解答这个问题。 1. 个人基础 自己的基础对于学习…...

Java中使用HttpPost发送form格式的请求

在Java中使用HttpPost发送form格式的请求&#xff0c;可以使用Apache HttpClient库来实现。以下是一个示例代码&#xff1a; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client…...

C语言----字节对齐

一&#xff1a;字节对齐的概念 针对字节对齐&#xff0c;百度百科的解释如下&#xff1a; 字节对齐是字节按照一定规则在空间上排列&#xff0c;字节(Byte)是计算机信息技术用于计量存储容量和传输容量的一种计量单位&#xff0c;一个字节等于8位二进制数&#xff0c;在UTF-8编…...

Next.js入门介绍(服务端渲染)

Next.js 一 目录 不折腾的前端&#xff0c;和咸鱼有什么区别 目录一 目录二 前言三 设置四 多页面五 链接六 样式七 共享组件八 布局组件九 实战 9.1 目录结构 9.2 UI 组件 9.3 Markdown 内容 9.4 Pages 入口和 API  9.4.1 服务端渲染 9.5 Public 静态资源 9.6 resor…...

模板Plus

文章目录 1.非类型模板参数的引入2.标准库和普通数组3.模板的特化 1.非类型模板参数的引入 //非类型模板参数 -- 常量 template<class T, size_t N 10> class array { private:T _a[N]; };int main() {array<int> a1;array<int, 100> a2;array<double, …...

spring事务和数据库事务是怎么实现

Spring事务的原理 Spring事务的本质其实就是数据库对事务的支持&#xff0c;没有数据库的事务支持&#xff0c;spring是无法提供事务功能的。对于纯JDBC操作数据库&#xff0c;想要用到事务&#xff0c;可以按照以下步骤进行&#xff1a; 获取连接 Connection con DriverManag…...

el-date-picker设置默认当前日期

HTMl部分&#xff1a; <el-form-item label"拍摄时间&#xff1a;"><el-date-pickerv-model"searchData.filmingTimeRange"type"daterange"align"right"unlink-panelsrange-separator"至"start-placeholder"…...

vue中使用this.$refs获取不到子组件的方法,属性方法都为undefined的解决方法

问题描述 vue2中refs获取不到子组件中的方法&#xff1f;&#xff0c;而获取到的是undefined 原因及解决方案&#xff1a; 第一种、在循环中注册了很多个ref 因为注册了多个ref&#xff0c;获取是不能单单知识refs.xxx&#xff0c;需要使用数组和索引来获取具体一个组件refs[…...

Linux命令200例:df用于显示文件系统的磁盘空间使用情况

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…...

实战二:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

北大开源音频编辑模型PlayDiffusion,可实现音频局部编辑,比传统 AR 模型的效率高出 50 倍!

北大开源了一个音频编辑模型PlayDiffusion&#xff0c;可以实现类似图片修复(inpaint)的局部编辑功能 - 只需修改音频中的特定片段&#xff0c;而无需重新生成整段音频。此外&#xff0c;它还是一个高性能的 TTS 系统&#xff0c;比传统 AR 模型的效率高出 50 倍。 自回归 Tra…...

[蓝桥杯 2024 国 B] 立定跳远

问题描述 在运动会上&#xff0c;小明从数轴的原点开始向正方向立定跳远。项目设置了 n 个检查点 a1,a2,...,an且 ai≥ai−1>0。小明必须先后跳跃到每个检查点上且只能跳跃到检查点上。同时&#xff0c;小明可以自行再增加 m 个检查点让自己跳得更轻松。在运动会前&#xf…...

学习数字孪生,为你的职业发展开辟新赛道

你有没有想过&#xff0c;未来十年哪些技能最吃香&#xff1f; AI、大数据、智能制造、元宇宙……这些词频繁出现在招聘市场和行业报告中。而在它们背后&#xff0c;隐藏着一个“看不见但无处不在”的关键技术——数字孪生&#xff08;Digital Twin&#xff09;。 它不仅在制造…...

光学字符识别(OCR)理论概述与实践教程

一、 光学字符识别(OCR)理论基础 OCR,即Optical Character Recognition,旨在通过计算机视觉和模式识别技术,将图像中包含的文本信息转换为机器可编辑、可搜索的文本数据。这项技术是实现信息数字化、自动化处理纸质或图像化文档的关键。 1. OCR处理管线 OCR系统通常采用…...

网页前端开发(基础进阶4--axios)

Ajax Ajax(异步的JavaScript和XML) 。 XML是可扩展标记语言&#xff0c;本质上是一种数据格式&#xff0c;可以用来存储复杂的数据结构。 可以通过Ajax给服务器发送请求&#xff0c;并获取服务器响应的数据。 Ajax采用异步交互&#xff1a;可以在不重新加载整个页面的情况下&am…...

SQL进阶之旅 Day 17:大数据量查询优化策略

文章标题 【SQL进阶之旅 Day 17】大数据量查询优化策略 文章内容 开篇 欢迎来到"SQL进阶之旅"系列的第17天&#xff01;在前面的16天中&#xff0c;我们从基础的表设计、索引应用到复杂的窗口函数和高级索引策略&#xff0c;逐步深入探讨了SQL的核心技术。今天我们…...

C++ if语句完全指南:从基础到工程实践

一、选择结构在程序设计中的核心地位 程序流程控制如同城市交通网络&#xff0c;if语句则是这个网络中的决策枢纽。根据ISO C标准&#xff0c;选择结构占典型项目代码量的32%-47%&#xff0c;其正确使用直接影响程序的&#xff1a; 逻辑正确性 执行效率 可维护性 安全边界 …...

resolvers: [ElementPlusResolver()] 有什么用?

resolvers: [ElementPlusResolver()] 是配合特定自动化导入插件&#xff08;如 unplugin-vue-components 和 unplugin-auto-import&#xff09;使用的配置项&#xff0c;其核心作用是‌实现 Element Plus 组件库的按需自动导入‌。 具体来说&#xff1a; 自动导入组件 (对应 …...

推荐10个AI视频生成工具网站

以下是10个AI视频生成工具网站推荐&#xff1a; 国内工具 可灵&#xff1a;由快手AI团队研发&#xff0c;支持文生视频、图生视频、首尾帧设置和运镜调整等功能&#xff0c;生成视频画质高&#xff0c;适合短视频创作、AI唱跳、动画短片等。官网&#xff1a;可灵 即梦&#…...