Spring——全局异常处理(介绍@RestControllerAdvice和@ExceptionHandler)

目录

  • 1.@RestControllerAdvice@ExceptionHandler的作用
  • 2.实现原理
  • 3.各种特性

1.@RestControllerAdvice@ExceptionHandler的作用

  1. @RestControllerAdvice注解

@RestControllerAdvice是Spring框架提供的注解,用于全局异常处理。它将异常处理方法集中在一个类中,统一处理项目中的异常情况。

  1. @ExceptionHandler注解

@ExceptionHandler是Spring框架提供的注解,用于处理特定的异常。它标记在方法上,当抛出指定类型的异常时,会调用该方法进行处理。

@RestControllerAdvice注解的代码示例:

@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ResponseEntity<String> handleException(Exception e) {// 处理异常逻辑return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Internal Server Error");}@ExceptionHandler(UserNotFoundException.class)public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException e) {// 处理用户不存在异常逻辑return ResponseEntity.status(HttpStatus.NOT_FOUND).body("User Not Found");}}

上述代码中,使用@RestControllerAdvice注解标记全局异常处理器类GlobalExceptionHandler。通过@ExceptionHandler注解定义了两个异常处理方法,分别处理通用的Exception异常和自定义的UserNotFoundException异常。在每个方法中,可以编写具体的异常处理逻辑,并返回相应的响应信息给前端。

关于@RestControllerAdvice注解的特性解释:

  1. 统一异常处理:通过@RestControllerAdvice注解,将所有的异常处理方法集中在一个类中,实现统一异常处理。
  2. AOP机制:使用AOP机制,将带有@ExceptionHandler注解的方法与异常的抛出点进行绑定,实现全局异常处理。
  3. 异常类型匹配:根据异常的类型来选择合适的@ExceptionHandler方法进行处理。
  4. 异常处理顺序:多个@ExceptionHandler注解的方法可以处理不同类型的异常,执行顺序是根据异常的继承关系来确定的,从子类异常到父类异常的顺序执行。

关于@ExceptionHandler注解的代码示例:

@RestController
public class UserController {@Autowiredprivate UserService userService;@ExceptionHandler(UserNotFoundException.class)public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException e) {// 处理用户不存在异常逻辑return ResponseEntity.status(HttpStatus.NOT_FOUND).body("User Not Found");}@GetMapping("/users/{userId}")public ResponseEntity<User> getUserById(@PathVariable("userId") int userId) {User user = userService.getUserById(userId);if (user == null) {throw new UserNotFoundException("User not found");}return ResponseEntity.ok(user);}}

上述代码中,使用@ExceptionHandler注解定义了一个异常处理方法handleUserNotFoundException,用于处理UserNotFoundException异常。在getUserById方法中,如果根据userId查询不到用户,则抛出UserNotFoundException异常,全局异常处理器会调用handleUserNotFoundException方法进行处理。

关于@ExceptionHandler注解的特性解释:

  1. 异常细粒度处理:根据异常的类型,进行不同的处理。在代码示例中,handleUserNotFoundException方法只处理UserNotFoundException异常。
  2. 自定义异常处理:通过自定义异常类型,我们可以灵活地定义异常处理逻辑,并返回自定义的响应信息给前端。
  3. 异常信息返回:在异常处理方法中,可以根据需要返回不同的响应信息给前端。在代码示例中,handleUserNotFoundException方法返回的响应信息是"User Not Found"。
  4. 异常处理顺序:多个@ExceptionHandler注解的方法可以处理不同类型的异常,执行顺序是根据异常的继承关系来确定的。在代码示例中,如果同时抛出Exception和UserNotFoundException异常,会先执行handleUserNotFoundException方法。

通过以上代码示例和解释,我们可以更加深入地理解@RestControllerAdvice和@ExceptionHandler这两个注解的作用、实现原理和各种特性。在实际项目中,我们可以根据需求,灵活地使用这两个注解来实现全局异常处理,提高系统的稳定性和用户体验。

2.实现原理

  1. @RestControllerAdvice的实现原理

@RestControllerAdvice注解实现全局异常处理的原理是通过AOP(面向切面编程)机制,将带有@ExceptionHandler注解的方法与异常的抛出点进行绑定。当抛出异常时,Spring框架会根据异常的类型,选择合适的@ExceptionHandler方法进行处理。

  1. @ExceptionHandler的实现原理

@ExceptionHandler注解的实现原理是通过定义一个带有@ExceptionHandler注解的方法,在方法中编写异常处理的逻辑。当抛出指定类型的异常时,Spring框架会自动调用该方法进行异常处理。

3.各种特性

  1. 统一异常处理

@RestControllerAdvice注解可以将所有异常处理方法集中在一个类中,实现统一异常处理。它可以捕获项目中所有的异常,从而避免异常信息直接抛给前端,提高系统的稳定性和用户体验。

  1. 异常细粒度处理

@ExceptionHandler注解可以根据异常的类型,进行不同的处理。这使得我们可以根据具体的异常类型,编写相应的处理逻辑,实现异常的细粒度处理。

  1. 自定义异常处理

通过自定义异常类型,并在@ExceptionHandler方法中处理该异常,我们可以根据业务需要,灵活地定义异常处理逻辑,并返回自定义的响应信息给前端。

  1. 异常信息返回

在异常处理方法中,我们可以根据需要返回不同的响应信息给前端,例如错误码、错误信息等。这样,前端可以根据不同的响应信息进行相应的处理和展示。

  1. 异常处理顺序

多个@ExceptionHandler注解的方法可以处理不同类型的异常,但是它们的执行顺序是根据异常的继承关系来确定的。具体规则是从子类异常到父类异常的顺序执行,直到找到合适的异常处理方法。

总结

本文介绍了Java前后端分离项目中Spring全局异常处理器的实现,包括@RestControllerAdvice和@ExceptionHandler这两个注解的作用、实现原理和各种特性。通过使用全局异常处理器,我们能够统一处理项目中的异常情况,提高系统的稳定性和用户体验。同时,我们也了解到了全局异常处理器的灵活性和自定义性,使得我们可以根据业务需要,对不同类型的异常进行细粒度的处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/191895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣66. 加一

文章目录 力扣66. 加一示例代码实现总结收获 力扣66. 加一 示例 代码实现 class Solution {public int[] plusOne(int[] digits) {int ndigits.length;for(int in-1;i>0;i--){if(digits[i]!9){digits[i];for(int ji1;j<n;j){digits[j]0;}return digits;}}int[] resnew i…

selenium环境安装

一、下载安装python 下载python安装python设置python环境变量安装selenium &#xff08;1&#xff09;下载python 您可以从Python官方网站&#xff08;https://www.python.org/downloads/&#xff09;下载Python。在页面上&#xff0c;您将看到不同版本的Python供您选择。根…

Qt中对Udp数据打包发送和接收(续)

这次用一个更加复杂的数据包举例。 心跳报文结构如下&#xff1a; struct HeartbeatPacket {quint16 protocolId;quint16 version;quint16 totalLength;quint16 reserve;QByteArray senderAddress;QByteArray receiverAddress;quint8 sequenceNumber;quint8 acknowledgementN…

MVCC-

文章目录 1. 什么是MVCC2. 快照读和当前读3. 复习4. MVCC实现原理之ReadView5. 总结 文章目录 1. 什么是MVCC2. 快照读和当前读3. 复习4. MVCC实现原理之ReadView5. 总结 1. 什么是MVCC 口述&#xff1a;MVCC其实他是解决这种读-写的情况的&#xff0c;当然读-写也可以用 锁来…

医保支付方式探索——利益共享机制的文章分析

Care-coordination: Gain-sharing Agreements in Bundled Payment Models 分析一下这篇文章&#xff0c;这篇文章于2021年发表在POMS上&#xff0c;但是引用量没有那么高。这篇文章涉及到医疗捆绑支付&#xff0c;应该可以学习一下。 文章研究一个在一个以最小成本为目标的质…

python+Appium自动化:python多线程多并发启动appium服务

Python启动Appium 服务 使用Dos命令或者bat批处理来手动启动appium服务&#xff0c;启动效率低下。如何将启动Appium服务也实现自动化呢&#xff1f; 这里需要使用subprocess模块&#xff0c;该模块可以创建新的进程&#xff0c;并且连接到进程的输入、输出、错误等管道信息&…

oj塞氪算法练习

向量点积计算 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();int[] a new int[n];int[] b new int[n];for (int i 0; i < n; i) {a[i] scanner.nextInt();}…

汇编语言实现音乐播放器

目标程序 用汇编语言实现一个音乐播放器&#xff0c;并支持点歌 Overview 乐曲是按照一定的高低、长短和强弱关系组成的音调&#xff0c;在一首乐曲中&#xff0c;每个音符的音高和音长与频率和节拍有关&#xff0c;因此我们要分别为3首要演奏的乐曲定义一个频率表和一个节拍…

jenkins使用nexus插件

nexus介绍 Nexus 是一个强大的仓库管理工具&#xff0c;用于管理和分发 Maven、npm、Docker 等软件包。它提供了一个集中的存储库&#xff0c;用于存储和管理软件包&#xff0c;并提供了版本控制、访问控制、构建和部署等功能。 Nexus 可以帮助开发团队提高软件包管理的效率和…

解决element ui tree组件不产生横向滚动条

结果是这样的 需要在tree的外层&#xff0c;包一个父组件 <div class"tree"><el-tree :data"treeData" show-checkbox default-expand-all></el-tree></div> 在css里面这样写,样式穿透按自己使用的css编译器以及框架要求就好 &l…

使用waitress与nginx在腾讯云上进行flask项目部署

1.首先介绍一下waitress与nginx是啥&#xff0c; Waitress: 类别&#xff1a; Waitress 是一个用于 Python Web 应用程序的 WSGI&#xff08;Web Server Gateway Interface&#xff09;服务器。WSGI 是 Python Web 应用程序和 Web 服务器之间的标准接口&#xff0c;允许开发人员…

什么是Ros(一)- 名词解释和架构概述

目录 1.概述 2.名词解释 2.1节点&#xff08;Node&#xff09; 2.2节点管理器&#xff08;Master&#xff09; 2.3消息&#xff08;Message&#xff09; 2.4话题&#xff08;Topic&#xff09; 2.5服务&#xff08;Service&#xff09; 2.6动作&#xff08;Action&#…

基于Logistic回归实现二分类

目录 Logistic回归公式推导&#xff1a; Sigmoid函数&#xff1a; Logistic回归如何实现分类&#xff1a; 优化的方法&#xff1a; 代码&#xff1a; 1.创建一个随机数据集&#xff0c;分类直线为y2x&#xff1a; 为什么用np.hstack()增加一列1&#xff1f; 为什么返回…

Spring | Spring的基本应用

目录: 1.什么是Spring&#xff1f;2.Spring框架的优点3.Spring的体系结构 (重点★★★) :3.1 Core Container (核心容器) ★★★Beans模块 (★★★) : BeanFactoryCore核心模块 (★★★) : IOCContext上下文模块 (★★★) : ApplicationContextContext-support模块 (★★★)SpE…

[传智杯 #3 练习赛] 直角三角形

题目描述 一个直角三角形的两个直角边是a,b(a≤b)&#xff0c;其斜边是 c&#xff0c;且 a,b,c 都是正整数。 现在我们已经知道了斜边长度 c&#xff0c;请问这个直角三角形的两个直角边的长度是什么&#xff1f; 输入格式 输入一个整数 c(1≤c≤1.41104)。 输出格式 输出…

【Erlang进阶学习】4、进程与消息传递

在Erlang系统中&#xff0c;进程都是轻量级的&#xff0c;意味着创建进程只需要花费微不足道的时间和极少的内存。 1、进程间不共享内存&#xff0c;而是通过消息传递来通信。 2、消息从发送进程的栈上复制到接收进程的堆上。 3、由于多个进程并发地在独立的内存空间执行&#…

RocketMQ- 深入理解RocketMQ的消息模型

1、RocketMQ客户端基本流程 ​ RocketMQ基于Maven提供了客户端的核心依赖&#xff1a; <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>4.9.5</version> </dependency&…

PyQt6 QCheckBox复选框按钮控件

​锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计33条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话…

Three.js的THREE.LOD如何加载gltf模型

要在Three.js中使用THREE.LOD加载gltf模型&#xff0c;可以按照以下步骤操作&#xff1a; 1、首先&#xff0c;确保已经引入了Three.js库和GLTFLoader插件。可以通过以下方式引入&#xff1a; <script src"https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/thre…