SpringBoot 如何使用 @RestControllerAdvice 注解进行 RESTful 异常处理

news2024/9/21 12:35:42

SpringBoot 如何使用 @RestControllerAdvice 注解进行 RESTful 异常处理

在 SpringBoot 应用程序中,RESTful 异常处理是一个非常重要的话题。当 RESTful API 出现异常时,我们需要对异常进行处理,以保证 API 的稳定性和可靠性。SpringBoot 提供了一种方便的方式来处理 RESTful 异常,即使用 @RestControllerAdvice 注解。本文将介绍如何使用 @RestControllerAdvice 注解进行 RESTful 异常处理。

在这里插入图片描述

什么是 @RestControllerAdvice 注解?

@RestControllerAdvice 注解用于定义全局的 RESTful 异常处理器。当应用程序中抛出异常时,SpringBoot 会自动调用 @RestControllerAdvice 注解标注的类中的方法进行处理,并返回一个包含错误信息的 JSON 响应。该注解的语法如下:

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorResponse> handleException(Exception ex) {
        // 处理异常并返回错误响应
    }
}

在上面的代码中,@RestControllerAdvice 注解定义了一个类 GlobalExceptionHandler,用于全局 RESTful 异常处理。当应用程序中抛出异常时,SpringBoot 会自动调用 GlobalExceptionHandler 类中的方法进行处理,并返回一个包含错误信息的 JSON 响应。

如何使用 @RestControllerAdvice 注解进行 RESTful 异常处理

下面我们通过一个示例来演示如何使用 @RestControllerAdvice 注解进行 RESTful 异常处理。

步骤 1:创建 SpringBoot 项目

首先,我们需要创建一个 SpringBoot 项目。可以使用 Spring Initializr 快速创建一个空的 SpringBoot 项目。在项目中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

其中,spring-boot-starter-web 依赖用于创建 Web 项目,spring-boot-starter-validation 依赖用于数据校验。

步骤 2:定义异常类

接下来,我们需要定义一个异常类,用于抛出异常。具体代码如下:

@ResponseStatus(HttpStatus.BAD_REQUEST)
public class BadRequestException extends RuntimeException {

    public BadRequestException(String message) {
        super(message);
    }

}

在上面的代码中,BadRequestException 类继承了 RuntimeException 类,并使用 @ResponseStatus 注解指定了 HTTP 状态码为 400(Bad Request)。

步骤 3:校验请求参数

接下来,我们需要在控制器中添加数据校验逻辑,以确保请求参数的有效性。具体代码如下:

@RestController
@RequestMapping("/users")
public class UserController {

    @PostMapping
    public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
        User savedUser = userRepository.save(user);
        return ResponseEntity.status(HttpStatus.CREATED).body(savedUser);
    }

}

在上面的代码中,我们使用 @Valid 注解和 @RequestBody 注解来校验请求体中的数据。如果请求参数不符合校验规则,则会抛出 MethodArgumentNotValidException 异常。

步骤 4:创建全局异常处理器

最后,我们需要创建一个全局 RESTful 异常处理器,用于处理应用程序中抛出的异常。具体代码如下:

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(MethodArgumentNotValidException ex) {
        String message = ex.getBindingResult().getFieldError().getDefaultMessage();
        ErrorResponse errorResponse = new ErrorResponse(HttpStatus.BAD_REQUEST.value(), message);
        return ResponseEntity.badRequest().body(errorResponse);
    }

    @ExceptionHandler(BadRequestException.class)
    public ResponseEntity<ErrorResponse> handleBadRequestException(BadRequestException ex) {
        ErrorResponse errorResponse = new ErrorResponse(HttpStatus.BAD_REQUEST.value(), ex.getMessage());
        return ResponseEntity.badRequest().body(errorResponse);
    }

}

在上面的代码中,我们使用 @RestControllerAdvice 注解定义了一个类 GlobalExceptionHandler,用于全局 RESTful 异常处理。其中,@ExceptionHandler 注解用于指定处理特定类型的异常的方法。在上面的代码中,我们定义了处理 MethodArgumentNotValidExceptionBadRequestException 的方法,并返回一个包含错误信息的 JSON 响应。

ErrorResponse 类用于封装错误信息和 HTTP 状态码。具体代码如下:

public class ErrorResponse {

    private int statusCode;
    private String message;

    public ErrorResponse(int statusCode, String message) {
        this.statusCode = statusCode;
        this.message = message;
    }

    // getter 和 setter 方法省略
}

在上面的代码中,ErrorResponse 类包含了 HTTP 状态码和错误信息两个属性。我们可以在全局 RESTful 异常处理器中使用该类来封装错误信息和 HTTP 状态码,并返回一个包含错误信息的 JSON 响应。

步骤 5:测试

最后,我们可以使用 Postman 或类似的工具来测试我们的控制器。例如,我们可以发送一个 POST 请求到 /users,并在请求体中添加无效的数据,这会导致控制器抛出 MethodArgumentNotValidException 异常,并返回 HTTP 状态码为 400 和包含错误信息的 JSON 响应。

总结

本文介绍了如何使用 @RestControllerAdvice 注解进行 RESTful 异常处理。通过 @RestControllerAdvice 注解,我们可以方便地定义全局的 RESTful 异常处理器,并处理应用程序中抛出的异常。在实际开发中,我们可以根据具体的业务需求来选择合适的异常处理方式,并编写相应的异常处理逻辑,以保证 API 的稳定性和可靠性。

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

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

相关文章

【SpringBoot】SpringBoot的发展沿革,相关介绍,特点,重要策略以及安装步骤讲解

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

Java·Map和Set

文章目录 &#x1f3ef;1. 搜索&#x1f3ef;1.1 概念及场景1.2 模型 &#x1f3f0;2. Map 的使用&#x1f3f0;2.1 关于Map的说明2.2 关于Map.Entry的说明2.3 Map 的常用方法说明2.4 TreeMap的使用案例2.5HashMap源码分析 ⛺️3. Set 的说明⛺️3.1 常见方法说明 &#x1f3ed…

设计模式—访问者模式

需求&#xff1a;店铺采购了一批水果&#xff08;苹果及橘子&#xff09;&#xff0c;现在市场监督局来店里检查过期的水果。 public class Fruit {private String name;private Date pickDate;public Fruit(String name, Date pickDate) {this.name name;this.pickDate pic…

【Unity之IMGUI】—位置信息类和控件基类的封装

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a; ⭐…

出现线程死锁缺陷一般有那些原因?该怎么解决?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言什么是线程死锁线程…

【Python】文件操作 ⑤ ( 文件操作 | 以只读模式向已有文件写入数据 | 以追加模式向已有文件写入数据 | 以追加模式打开一个不存在的文件 )

文章目录 一、向文件写出数据1、以只读模式向已有文件写入数据2、以追加模式向已有文件写入数据3、以追加模式打开一个不存在的文件 一、向文件写出数据 1、以只读模式向已有文件写入数据 使用 write 函数向已有文件写入数据 , 会清空该文件中的数据 , 代码展示如下 : file1.t…

当mysql遇上PHP

一.利用PHP连接mySQL数据库 这要从一个故事说起。 某一天&#xff0c;一位名叫MySQL的农夫的一把斧子&#xff08;数据库操作&#xff09;掉进了一条名为PHP的河里&#xff0c;这时候&#xff0c;一位好心的河神出现了 PHP河的河神问他。。。。 下面&#xff0c;咱们还是说正经…

Kubernetes API Server源码学习(三):KubeAPIServer、APIExtensionsServer、AggregatorServer

本文基于Kubernetes v1.22.4版本进行源码学习 9、KubeAPIServer GenericAPIServer提供了一些通用的功能&#xff0c;其他的Server基于GenericAPIServer进行拓展&#xff0c;代码量就会减少许多 KubeAPIServer负责处理Kubernetes内建资源的REST请求&#xff0c;比如Pod、Deploy…

C/C++系列系统学习目录

友情链接&#xff1a;专栏地址 文章目录 一、C语言篇二、C篇 编程规范&#xff1a;C/C语言编程规范 一、C语言篇 章节内容1.初识C语言【C语言篇】初识C语言2.C语言最基础入门【C语言篇】C语言最基础入门3.C语言的输入输出相关知识【C语言篇】C语言的输入/输出相关知识4.C语言…

【Pytest实战】Pytest+Allure+Jenkins自动化测试框架搭建

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想…

从零开始理解Linux中断架构(5)--EL跃迁与Linux用户/内核态

ARM64系统Reset时,PE进入最高的异常级别运行状态 1)Reset后最高异常级别可以选用任何一种运行状态 2)cold reset由输入信号配置,warm reset由RMR_ELx.AA64配置 1)内核态EL1迁移到EL0t 上一节我们提到需要仔细理解的图吗?eret这条特殊的异常返回指令。 我们期望…

《机器学习公式推导与代码实现》chapter14-CatBoost

《机器学习公式推导与代码实现》学习笔记&#xff0c;记录一下自己的学习过程&#xff0c;详细的内容请大家购买作者的书籍查阅。 CatBoost CatBoost是俄罗斯搜索引擎巨头Yandex于2017年开源的一款GBDT计算框架&#xff0c;因能够高效处理数据中的类别特征而取名为CatBoost(C…

一时兴起之matlab学习记录

是学习记录&#xff0c;会有错误的地方 安装的话看其他文章把 小操作 查看历史命令 在输入命令的地方&#xff0c;按下↑的方向键即可 变量 对大小写敏感若想以指定的类型存储就是 类型名(值),如 int16(4)&#xff0c;这个也可以强转变量名字有限制&#xff0c;键入namele…

10分钟搭建Stable Diffusion

前言 人工智能生成内容&#xff08;Artificial Intelligence Generated Content&#xff0c;简称 AIGC&#xff09;是当下最火的概念之一。AIGC 被认为是继专业生成内容&#xff08;Professional Generated Content, PGC&#xff09;和用户生成内容&#xff08;User Generated…

【MySQL】数据库基础 ③

上一章&#xff1a; 【MySQL】数据库基础 ② ✍临时表 说明&#xff1a; MySQL 临时表在我们需要保存一些临时数据时是非常有用的。临时表只在当前连接可见&#xff0c;…

局域网实验报告

计算机网络综合实训 实训报告一 所在院系 计算机与信息工程学院 学科专业名称 计算机科学与技术 导师及职称 柯宗武 教授 提交时间 2023.3.10 网络层实验报告 &#xff08;湖北师范大学计算机与信息工程学院 中国 黄石 435002&#xff09; 1 集线器与交换机的对比实验 1.1 背…

【Python】自动化构建项目结构样式

引言 在使用Python或者其它编程语言的项目时候&#xff0c;编写README.md 往往是不可或缺的&#xff1b; 而在README.md 中&#xff0c;关于项目结构的样式展示&#xff0c;这个是可选的。不展示也无伤大雅&#xff0c;但有展示的话&#xff0c;有以下优点&#xff1a; 提供…

第九章 总结及作业(4)【编译原理】

第九章 总结及作业&#xff08;4&#xff09;【编译原理】 前言推荐第九章 运行时存储空间组织9.1 目标程序运行时的活动9.1.1过程的活动9.1.2参数传递 9.2 运行时存储器的划分9.2.1运行时存储器的划分9.2.2 活动记录9.2.3 存储分配策咯 9.3 静态存储分配9.3.1数据区*9.3.2公用…

基于深度学习的人脸检测技术

用到环境 1、pycharm community edition 2022.3.2 2、Python 3.10 整篇内容都已上传至我的csdn资源中&#xff0c;想用的请移步。 流程 多任务级联卷积神经网络(Multi-task Cascaded Convolutional Networks, MTCNN)算法进行人脸检测 普通人脸检测 单人人脸检测 图1 单人人…

我最喜欢的编程语言是python,以及我的见解!!

这里写目录标题 我最喜欢的编程语言&#xff1a;1、我个人认为编程语言优劣的评选标准2、我对不同编程语言的优点与缺点的拙见**1. Java****2. Python****3. JavaScript****4. C语言&#xff1a;****5. C语言&#xff1a;** 3、对python编程语言未来发展的猜测和未来趋势 我最喜…