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

@RestControllerAdvice注解

@RestControllerAdvice 是 Spring 4 引入的一个组合注解,它结合了 @ControllerAdvice@ResponseBody,专门用于处理 @RestController 类型的控制器中的全局异常、全局数据绑定和全局模型属性等问题。在 Spring Boot 中,@RestControllerAdvice 通常用于统一处理应用中的异常,确保系统中的异常处理逻辑集中管理。

1. @RestControllerAdvice 的组成

@RestControllerAdvice 实际上是两个注解的组合:

  • @ControllerAdvice:是一个用于全局处理 Spring MVC 中异常的注解,它的作用范围不仅限于某个单一的控制器,而是全局适用。
  • @ResponseBody:表示返回的对象会自动序列化为 JSON 格式,直接作为 HTTP 响应体返回。

因此,@RestControllerAdvice 结合了这两者的功能,表示该类是一个控制器增强器,可以全局处理异常、模型属性或数据绑定等,而且返回的结果会直接作为 HTTP 响应体(通常是 JSON 格式)返回给客户端。

2. @RestControllerAdvice 的功能

@RestControllerAdvice 主要有以下几个功能:

1. 全局异常处理 (@ExceptionHandler)

@RestControllerAdvice 可以结合 @ExceptionHandler 注解来全局处理异常。应用中抛出的异常会被该类中的方法捕获并处理,然后返回合适的响应结果。

例如:

@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ResultData handleException(Exception e) {log.error("Global exception occurred: ", e);return ResultData.fail("500", "Internal Server Error");}
}
  • @ExceptionHandler(Exception.class):表示该方法将处理所有类型的 Exception 异常。
  • handleException 方法会捕获到任何未被其他异常处理器捕获的 Exception,然后返回统一的错误响应。
2. 全局模型属性 (@ModelAttribute)

@RestControllerAdvice 可以在控制器方法执行前,通过 @ModelAttribute 注解向所有的控制器方法添加公共模型属性。这样,所有的控制器方法都可以访问到这些公共属性。

例如:

@RestControllerAdvice
public class GlobalModelAttribute {@ModelAttributepublic void addAttributes(Model model) {model.addAttribute("globalAttribute", "This is a global attribute");}
}
  • @ModelAttribute 注解的方法会在每个控制器方法执行之前执行。这里添加了一个名为 globalAttribute 的属性,这个属性会自动添加到每个控制器方法的 Model 中。
3. 全局数据绑定 (@InitBinder)

@RestControllerAdvice 也可以通过 @InitBinder 注解定义全局的数据绑定方法。@InitBinder 用于初始化数据绑定,通常用于处理请求参数的格式化和转换。

例如:

@RestControllerAdvice
public class GlobalDataBinder {@InitBinderpublic void initBinder(WebDataBinder binder) {binder.setDisallowedFields("password");}
}
  • @InitBinder 注解的方法可以用来处理请求参数的绑定和验证。在上面的例子中,所有请求参数中的 password 字段将被排除在外,不能进行绑定。

3. 常见用法

1. 全局异常处理

在 Spring Boot 中,异常处理通常分为两种:

  • 局部异常处理:每个控制器方法使用 try-catch 语句或者 @ExceptionHandler 处理特定的异常。
  • 全局异常处理:通过 @RestControllerAdvice 统一处理整个应用中的异常。

示例:

@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)public ResultData<String> handleException(Exception e) {log.error("Unexpected exception occurred: ", e);return ResultData.fail("500", "Internal Server Error");}@ExceptionHandler(ResourceNotFoundException.class)@ResponseStatus(HttpStatus.NOT_FOUND)public ResultData<String> handleResourceNotFound(ResourceNotFoundException e) {log.error("Resource not found: ", e);return ResultData.fail("404", e.getMessage());}
}
  • 通过 @ExceptionHandler 注解,可以指定不同的异常类型来进行处理。例如,Exception 类的异常返回 500 错误,ResourceNotFoundException 返回 404 错误。
  • 使用 @ResponseStatus 注解可以自定义返回的 HTTP 状态码。
2. 返回统一格式的响应

在实际应用中,通常会要求所有的 API 响应都遵循统一的格式。使用 @RestControllerAdvice 可以确保异常处理的响应符合统一的格式。

示例:

public class ResultData<T> {private String code;private String message;private T data;// 省略构造方法、getter、setter等
}

GlobalExceptionHandler 中,可以返回 ResultData 类型的对象,确保所有的异常响应都有一致的结构:

@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ResultData<String> handleException(Exception e) {return new ResultData<>("500", "Internal Server Error", null);
}
3. 全局模型属性和数据绑定

@RestControllerAdvice 还可以用来定义全局的模型属性和数据绑定逻辑。比如,可以在全局中设置一些公共的参数,或者格式化请求参数。

示例:

@RestControllerAdvice
public class GlobalDataBinder {@InitBinderpublic void initBinder(WebDataBinder binder) {binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));}
}

在这个例子中,@InitBinder 配置了一个全局的数据绑定,允许所有的控制器方法接收和格式化 Date 类型的参数。

4. @RestControllerAdvice 的优势

  • 集中管理异常:通过 @RestControllerAdvice,你可以把全局的异常处理逻辑集中在一个地方,而不需要在每个控制器中重复写异常处理代码。
  • 统一的错误响应:能够保证整个应用中返回的错误响应有统一的结构(例如 ResultData)。
  • 增强可维护性:集中式的异常处理和数据绑定配置使得代码更易维护和扩展。当业务需求发生变化时,只需要修改 @RestControllerAdvice 中的逻辑,而无需修改每个控制器的代码。
  • 减少冗余代码:通过全局处理,可以避免在多个控制器中重复定义相同的异常处理逻辑或数据绑定逻辑。
    是的,@RestControllerAdvice@ControllerAdvice 都可以实现相似的功能,特别是在处理全局模型属性和数据绑定时,使用 @ControllerAdvice 是完全可以的。两者的区别主要体现在以下几个方面:

5.@RestControllerAdvicevs@ControllerAdvice

@RestControllerAdvice vs @ControllerAdvice

  • @ControllerAdvice 是 Spring 的一个用于全局处理控制器异常、数据绑定、模型属性等的注解,适用于所有类型的控制器。它结合了 @Controller@ResponseBody 的功能,用于处理普通的控制器(即返回视图的控制器,通常是 .jsp.html 等)。

  • @RestControllerAdvice@ControllerAdvice@ResponseBody 的组合注解,适用于 RESTful 风格的控制器,即返回 JSON 或 XML 等数据的控制器。它与 @RestController 结合使用,可以自动将返回值转换为 JSON 格式的响应体,而 @ControllerAdvice 适用于传统的基于视图的控制器。

具体区别

  • 返回类型

    • @ControllerAdvice 默认处理的是基于视图的返回类型,也就是说,它通常返回的是页面视图(例如 .jsp.html)而非 JSON 数据。
    • @RestControllerAdvice 用于 RESTful API 服务,它默认会返回 JSON 数据,而不需要额外配置 @ResponseBody
  • 场景选择

    • 使用 @ControllerAdvice:如果你的应用主要是传统的 Spring MVC 控制器(处理视图渲染),那么 @ControllerAdvice 是合适的。
    • 使用 @RestControllerAdvice:如果你的应用是基于 RESTful API 服务,返回 JSON 或 XML 数据,并且你希望所有的异常处理、数据绑定、模型属性等也以 JSON 格式返回,那么 @RestControllerAdvice 更为合适。

实际应用中的选择

  • 如果你在做的是 传统的 Spring MVC 应用,并且通过控制器返回的是 视图(HTML),那么使用 @ControllerAdvice 是合适的。
  • 如果你在做的是 RESTful API 应用,返回的是 JSON 或 XML 数据,并且希望全局异常、全局数据绑定、全局模型属性等都以 JSON 格式返回给客户端,那么 @RestControllerAdvice 更为合适。

总结

@RestControllerAdvice 是 Spring 提供的一个功能强大的注解,允许你为整个应用提供全局的异常处理、全局模型属性和全局数据绑定等功能。它的主要优势是能够集中管理异常处理,并且提供统一的响应结构,使得应用程序更加清晰、易于维护,尤其在处理大规模应用时,能够极大地减少代码冗余,提高开发效率和系统的健壮性。

相关文章:

@RestControllerAdvice注解

RestControllerAdvice 是 Spring 4 引入的一个组合注解&#xff0c;它结合了 ControllerAdvice 和 ResponseBody&#xff0c;专门用于处理 RestController 类型的控制器中的全局异常、全局数据绑定和全局模型属性等问题。在 Spring Boot 中&#xff0c;RestControllerAdvice 通…...

Enum枚举类与静态变量和静态数组的区别

Enum枚举类与静态变量和静态数组的区别 组成结构Enum枚举类静态变量静态数组 组成结构的区别相同之处不同之处 用法使用相同之处不同之处 组成结构 先来看下Enum枚举类&#xff0c;静态变量&#xff0c;静态数组的初始化过程&#xff0c;以下面为例子&#xff1a; public enu…...

uniapp——微信小程序读取bin文件,解析文件的数据内容(三)

微信小程序读取bin文件内容 读取用户选择bin文件&#xff0c;并解析数据内容&#xff0c;分包发送给蓝牙设备&#xff1b; 文章目录 微信小程序读取bin文件内容读取文件读取内容返回格式 API文档&#xff1a; getFileSystemManager 关于App端读取bin文件&#xff0c;请查看&…...

SpringBoot集成ECDH密钥交换

简介 对称加解密算法都需要一把秘钥&#xff0c;但是很多情况下&#xff0c;互联网环境不适合传输这把对称密码&#xff0c;有密钥泄露的风险&#xff0c;为了解决这个问题ECDH密钥交换应运而生 EC&#xff1a;Elliptic Curve——椭圆曲线&#xff0c;生成密钥的方法 DH&…...

python文件操作相关(excel)

python文件操作相关&#xff08;excel&#xff09; 1. openpyxl 库openpyxl其他用法创建与删除操作单元格追加数据格式化单元格合并单元格插入图片公式打印设置保护工作表其他功能 2. pandas 库3. xlrd 和 xlwt 库4. xlsxwriter 库5. pyxlsb 库应用场景参考资料 在 Python 中&a…...

探索React与Microi吾码的完美结合:快速搭建项目,低代码便捷开发教程

一、摘要 在当今的数字化时代&#xff0c;软件开发就像是一场探险&#xff0c;每个开发者都是探险家&#xff0c;探索着代码的奥秘。React作为前端开发的领军框架&#xff0c;其组件化和高效的渲染机制为开发者提供了强大的工具。而Microi吾码低代码平台的出现&#xff0c;则为…...

【面试系列】深入浅出 Spring Boot

熟悉SpringBoot&#xff0c;对常用注解、自动装配原理、Jar启动流程、自定义Starter有一定的理解&#xff1b; 面试题 Spring Boot 的核心注解是哪个&#xff1f;它主要由哪几个注解组成的&#xff1f;Spring Boot的自动配置原理是什么&#xff1f;你如何理解 Spring Boot 配置…...

@colyseus/social 模块详解

@colyseus/social 模块介绍 @colyseus/social 是一个适用于 Colyseus 游戏框架的扩展模块,提供了社交功能的支持,帮助开发者在多人游戏中快速实现玩家之间的社交互动。它主要提供了玩家账户管理、好友系统、好友请求、组队和聊天功能等,旨在简化游戏中社交功能的实现。 核心…...

石岩路边理发好去处

周末带娃去罗租公园玩&#xff0c;罗租公园旁边就是百佳华和如意豪庭小区&#xff0c;发现如意豪庭小区对面挺多路边理发摊点 理发摊点聚焦在这里的原因是刚好前面城管来了暂时避避&#xff0c;例如还有一个阿姨剪到一半就跟着过来。这里的城管只是拍了一处没有摊位的地方&…...

ROS 2中的DDS中间件

文章目录 一、简介二、默认支持的 DDS (Data Distribution Service) 实现三、切换DDS实现小结 一、简介 中间件是一个软件层&#xff0c;通常用于连接不同的应用程序、服务或系统&#xff0c;以便它们能够相互通信和交换数据。中间件并不直接向用户暴露&#xff0c;而是在系统…...

「下载」智慧文旅运营综合平台解决方案:整体架构,核心功能设计

智慧文旅运营综合平台&#xff0c;旨在通过集成大数据、云计算、物联网、人工智能等先进技术&#xff0c;为景区、旅游企业及相关管理机构提供一站式的智慧化运营服务。 智慧文旅运营综合平台不仅能够提升游客的游览体验&#xff0c;还能帮助景区管理者实现资源的优化配置和业务…...

NVR小程序接入平台EasyNVR使用FFmpeg取流时提示错误是什么原因呢?

在视频监控系统中&#xff0c;FFmpeg常用于从各种源&#xff08;如摄像头、文件、网络流等&#xff09;获取流媒体数据&#xff0c;这个过程通常称为“取流”。 在EasyNVR平台中&#xff0c;使用FFmpeg取流是一种常见的操作。FFmpeg作为一款强大的开源多媒体处理工具&#xff…...

计算机因进程结束导致白屏

问题场景&#xff1a; 计算机卡顿利用&#xff08;右击计算机桌面底部任务栏->打开任务管理器->结束任务->或进程被意外结束导致白屏&#xff09; 问题描述 白屏 原因分析&#xff1a; 在结束进程时&#xff0c;导致 文件资源管理器 进程崩溃。 解决方案&#xf…...

OpenGL入门最后一章观察矩阵(照相机)

前面的一篇文章笔者向大家介绍了模型变化矩阵&#xff0c;投影矩阵。现在只剩下最后一个观察矩阵没有和大家讲了。此片文章就为大家介绍OpenGL入门篇的最后一个内容。 观察矩阵 前面的篇章当中&#xff0c;我们看到了即使没有观察矩阵&#xff0c;我们也能对绘制出来的模型有一…...

ES6中定义私有属性详解

在ES6中&#xff0c;定义私有属性的方式相对传统的JavaScript有所不同。ES6并没有提供直接的语法来定义私有属性&#xff0c;但可以通过几种方法间接实现私有属性。 1. 使用Symbol来模拟私有属性 Symbol是一种新的数据类型&#xff0c;可以作为对象的键&#xff0c;并且它的值…...

工业5G路由器让无人机数据传输 “飞” 起来

无人机上搭载5G通信模块&#xff0c;该模块与工业5G路由器通过5G网络建立连接。无人机的飞控系统、传感器以及摄像头等设备采集到的数据&#xff0c;如飞行姿态、高度、速度、环境图像、温度湿度等&#xff0c;经过编码、加密、调制等处理后转换为适合5G网络传输的信号形式。 …...

面试经典150题——滑动窗口

文章目录 1、长度最小的子数组1.1 题目链接1.2 题目描述1.3 解题代码1.4 解题思路 2、无重复字符的最长子串2.1 题目链接2.2 题目描述2.3 解题代码2.4 解题思路 3、串联所有单词的子串3.1 题目链接3.2 题目描述3.3 解题代码3.4 解题思路 4、最小覆盖子串4.1 题目链接4.2 题目描…...

MiFlash 线刷工具下载合集

MiFlash 线刷工具下载合集 MiFlash 线刷工具下载合集 – MIUI历史版本相较于小米助手的刷机功能&#xff0c;线刷还是偏好使用 MiFlash。特点是界面简单纯粹&#xff0c;有自定义高级选项&#xff0c;可以选择刷机不上 BL 锁&#xff0c;自定义刷机脚本&#xff0c;EDL 刷机模…...

【MySQL高级】第1-4章

第1章 存储过程 1.1 什么是存储过程&#xff1f; 存储过程可称为过程化SQL语言&#xff0c;是在普通SQL语句的基础上增加了编程语言的特点&#xff0c;把数据操作语句(DML)和查询语句(DQL)组织在过程化代码中&#xff0c;通过逻辑判断、循环等操作实现复杂计算的程序语言。 换…...

课程设计项目之基于Python实现围棋游戏代码

项目介绍 游戏进去默认为九路玩法&#xff0c;当然也可以选择十三路或是十九路玩法 使用pycharam打开项目&#xff0c;pip安装模块并引用&#xff0c;然后运行即可&#xff0c; 代码每行都有详细的注释&#xff0c;可以做课程设计或者毕业设计项目参考 效果预览 源码下载 h…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

Linux 下 DMA 内存映射浅析

序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存&#xff0c;但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程&#xff0c;可以参考这篇文章&#xff0c;我觉得写的非常…...

多元隐函数 偏导公式

我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式&#xff0c;给定一个隐函数关系&#xff1a; F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 &#x1f9e0; 目标&#xff1a; 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​、 …...

用递归算法解锁「子集」问题 —— LeetCode 78题解析

文章目录 一、题目介绍二、递归思路详解&#xff1a;从决策树开始理解三、解法一&#xff1a;二叉决策树 DFS四、解法二&#xff1a;组合式回溯写法&#xff08;推荐&#xff09;五、解法对比 递归算法是编程中一种非常强大且常见的思想&#xff0c;它能够优雅地解决很多复杂的…...

数据库——redis

一、Redis 介绍 1. 概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的内存键值数据库系统&#xff0c;具有以下核心特点&#xff1a; 内存存储架构&#xff1a;数据主要存储在内存中&#xff0c;提供微秒级的读写响应 多数据结构支持&…...

【51单片机】4. 模块化编程与LCD1602Debug

1. 什么是模块化编程 传统编程会将所有函数放在main.c中&#xff0c;如果使用的模块多&#xff0c;一个文件内会有很多代码&#xff0c;不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里&#xff0c;在.h文件里提供外部可调用函数声明&#xff0c;其他.c文…...

EEG-fNIRS联合成像在跨频率耦合研究中的创新应用

摘要 神经影像技术对医学科学产生了深远的影响&#xff0c;推动了许多神经系统疾病研究的进展并改善了其诊断方法。在此背景下&#xff0c;基于神经血管耦合现象的多模态神经影像方法&#xff0c;通过融合各自优势来提供有关大脑皮层神经活动的互补信息。在这里&#xff0c;本研…...

基于Python的气象数据分析及可视化研究

目录 一.&#x1f981;前言二.&#x1f981;开源代码与组件使用情况说明三.&#x1f981;核心功能1. ✅算法设计2. ✅PyEcharts库3. ✅Flask框架4. ✅爬虫5. ✅部署项目 四.&#x1f981;演示效果1. 管理员模块1.1 用户管理 2. 用户模块2.1 登录系统2.2 查看实时数据2.3 查看天…...

React与原生事件:核心差异与性能对比解析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...