@RestControllerAdvice 的作用

news2025/1/30 14:46:18

系列博客目录


文章目录

  • 系列博客目录
  • 1.@ControllerAdvice 有什么用
      • 主要功能
  • 2.与 `@RestControllerAdvice` 的区别
  • 3.苍穹外卖中的使用
  • 4.@RestControllerAdvice可以指定范围吗
    • (1)指定应用到某些包中的 `@RestController`
    • (2)指定应用到具有特定注解的 `@RestController`
    • (3)指定应用到特定的 `@RestController` 类
    • (4)组合使用多个限制条件
    • 小结
  • 总结


1.@ControllerAdvice 有什么用

@ControllerAdvice 是 Spring 框架提供的一个用于处理全局异常、数据绑定、模型属性等的注解。它可以用来集中处理应用中的异常、日志记录、数据预处理等常见任务,从而减少重复的代码,提高可维护性。

主要功能

  1. 全局异常处理
    @ControllerAdvice 允许你在一个集中位置处理控制器(@Controller)抛出的异常。这样,你就不需要在每个控制器方法中写重复的异常处理代码。

    @ControllerAdvice
    public class GlobalExceptionHandler {
    
        @ExceptionHandler(Exception.class)
        public ResponseEntity<String> handleException(Exception ex) {
            return new ResponseEntity<>("Global exception: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }
    

    上面的代码会捕获所有控制器抛出的 Exception 异常,并返回统一的响应。

  2. 全局数据绑定
    @ControllerAdvice 还可以用于设置全局的模型属性,比如向所有的视图中添加一些通用数据(如当前用户信息等)。

    @ControllerAdvice
    public class GlobalModelAttributes {
    
        @ModelAttribute("user")
        public User addUser() {
            return new User("John", "Doe");
        }
    }
    

    这里,user 将会自动成为所有视图模型中的一个属性。

  3. 全局 @InitBinder
    @InitBinder 方法可以用于设置 Web 层的数据绑定配置。通过 @ControllerAdvice 可以设置全局的数据绑定方法,比如日期格式、字符串的修剪等。

    @ControllerAdvice
    public class GlobalBinderConfig {
    
        @InitBinder
        public void initBinder(WebDataBinder binder) {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
            binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
        }
    }
    

    通过 @InitBinder,你可以为所有的控制器设置全局的数据绑定规则。

  4. 局部作用域
    如果你不希望 @ControllerAdvice 处理全局的异常,也可以通过 @RestControllerAdvice 或者指定 basePackages 限制 @ControllerAdvice 的作用范围,使其仅对指定的包或类有效。

2.与 @RestControllerAdvice 的区别

  • @ControllerAdvice 用于传统的基于视图的控制器(即返回视图页面的控制器)。
  • @RestControllerAdvice 是专门为 @RestController 设计的,通常用于处理返回 JSON 或 XML 的 RESTful API,它是 @ControllerAdvice@ResponseBody 的组合。

3.苍穹外卖中的使用

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 捕获业务异常
     * @param ex
     * @return
     */
    @ExceptionHandler
    public Result exceptionHandler(BaseException ex){
        log.error("异常信息:{}", ex.getMessage());
        return Result.error(ex.getMessage());
    }

}

4.@RestControllerAdvice可以指定范围吗

是的,@RestControllerAdvice 也可以指定范围,类似于 @ControllerAdvice。你可以通过以下几种方式来限制 @RestControllerAdvice 的作用范围:

(1)指定应用到某些包中的 @RestController

使用 basePackages 属性,你可以限制 @RestControllerAdvice 只作用于某些包中的 @RestController 类。

@RestControllerAdvice(basePackages = "com.example.demo.rest")
public class RestControllerExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleException(Exception ex) {
        return new ResponseEntity<>("REST exception: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

在这个例子中,@RestControllerAdvice 只会作用于 com.example.demo.rest 包中的 @RestController 控制器。

(2)指定应用到具有特定注解的 @RestController

你可以使用 annotations 属性,限制 @RestControllerAdvice 只作用于具有特定注解的控制器。例如,@RestController 或其他自定义注解。

@RestControllerAdvice(annotations = RestController.class)
public class RestControllerExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleRestControllerException(Exception ex) {
        return new ResponseEntity<>("REST controller exception: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

这意味着 @RestControllerAdvice 只会影响被 @RestController 注解标记的控制器类。

(3)指定应用到特定的 @RestController

你还可以通过 assignableTypes 属性来限制 @RestControllerAdvice 只作用于某些指定类型的控制器类。

@RestControllerAdvice(assignableTypes = MyRestController.class)
public class SpecificRestControllerExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleSpecificRestControllerException(Exception ex) {
        return new ResponseEntity<>("Exception in MyRestController: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

在这个例子中,@RestControllerAdvice 只会作用于 MyRestController 类中的 @RestController

(4)组合使用多个限制条件

你还可以结合多种属性来进一步细化 @RestControllerAdvice 的应用范围,例如同时指定 basePackagesannotations

@RestControllerAdvice(basePackages = "com.example.demo.rest", annotations = RestController.class)
public class RestControllerExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleRestControllerException(Exception ex) {
        return new ResponseEntity<>("REST API exception: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

小结

@RestControllerAdvice 提供了类似于 @ControllerAdvice 的功能,可以通过 basePackagesannotationsassignableTypes 等属性来精确控制其适用范围。这样,你就可以将它限制在特定的包、注解或控制器类中,从而避免不必要的影响,增强代码的可维护性和清晰性。

总结

@ControllerAdvice 是 Spring 中一种集中处理异常、模型属性、数据绑定等的机制,它让你可以在一个地方集中管理所有控制器相关的操作,从而使得代码更加简洁和可维护。

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

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

相关文章

数据可视化的图表

1.折线图反映了一段时间内事物连续的动态变化规律,适用于描述一个变量随另一个变量变化的趋势,通常用于绘制连续数据,适合数据点较多的情况。 2.散点图是以直角坐标系中各点的密集程度和变化趋势来表示两种现象间的相关关系&#xff0c;常用于显示和比较数值。当要在不考虑时间…

简易CPU设计入门:控制总线的剩余信号(四)

项目代码下载 请大家首先准备好本项目所用的源代码。如果已经下载了&#xff0c;那就不用重复下载了。如果还没有下载&#xff0c;那么&#xff0c;请大家点击下方链接&#xff0c;来了解下载本项目的CPU源代码的方法。 CSDN文章&#xff1a;下载本项目代码 上述链接为本项目…

基础IO(2)

基础IO&#xff08;2&#xff09; 理解“⼀切皆⽂件” ⾸先&#xff0c;在windows中是⽂件的东西&#xff0c;它们在linux中也是⽂件&#xff1b;其次⼀些在windows中不是⽂件的东西&#xff0c;⽐如进程、磁盘、显⽰器、键盘这样硬件设备也被抽象成了⽂件&#xff0c;你可以使…

IDM-VTON本地部署教程:双重编码 + 文字提示,解锁真实野外试穿

一、介绍 IDM-VTON&#xff1a;改进扩散模型&#xff0c;实现真实的野外虚拟试穿。 技术原理&#xff1a;改进扩散模型&#xff0c;利用视觉编码器提取服装高级语义信息并与交叉注意力层融合&#xff0c;通过并行 UNet 结构的 GarmentNet 捕捉服装低级特征并与自注意力层结合&…

【2024年华为OD机试】 (C卷,200分)- 矩阵匹配(JavaScriptJava PythonC/C++)

一、问题描述 问题描述 给定一个大小为 ( N \times M )&#xff08;( N \leq M )&#xff09;的矩阵&#xff0c;从中选出 ( N ) 个数&#xff0c;要求任意两个数字不能在同一行或同一列。求选出来的 ( N ) 个数中第 ( K ) 大的数字的最小值。 输入描述 输入矩阵要求&#…

AI 浪潮席卷中国年,开启科技新春新纪元

在这博主提前祝大家蛇年快乐呀&#xff01;&#xff01;&#xff01; 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;其影响力已经渗透到社会生活的方方面面。在中国传统节日 —— 春节期间&#xff0c;AI 技术也展现出了巨大的潜力&#xff0c;为中国年带…

Python 数据分析 - Matplotlib 绘图

Python 数据分析 - Matplotlib 绘图 简介绘图折线图单线多线子图 散点图直方图条形图纵置横置多条 饼图 简介 Matplotlib 是 Python 提供的一个绘图库&#xff0c;通过该库我们可以很容易的绘制出折线图、直方图、散点图、饼图等丰富的统计图&#xff0c;安装使用 pip install…

搭建Spark分布式集群

1&#xff0c;下载 下载 spark-3.5.4-bin-without-hadoop.tgz 地址&#xff1a; https://downloads.apache.org/spark/spark-3.5.4/ 2&#xff0c;安装 通过虚拟机设置共享文件夹将需要的安装包复制到linux虚拟机中 localhost1。虚拟机的共享盘在 /mnt/hgfs/。 将共享盘安装…

新年祝词(原创)

新年将至&#xff0c;福进万户。 家家团圆&#xff0c;事事顺心。 喜迎财神&#xff0c;多寿添金。 瑞兽迎春&#xff0c;炮竹声起。 趋吉避凶&#xff0c;蛇年大吉。 中华崛起&#xff0c;人人自强。 天下大同&#xff0c;百姓富足。 有情有义&#xff0c;平易近人。 …

线上突发:MySQL 自增 ID 用完,怎么办?

线上突发&#xff1a;MySQL 自增 ID 用完&#xff0c;怎么办&#xff1f; 1. 问题背景2. 场景复现3. 自增id用完怎么办&#xff1f;4. 总结 1. 问题背景 最近&#xff0c;我们在数据库巡检的时候发现了一个问题&#xff1a;线上的地址表自增主键用的是int类型。随着业务越做越…

ESP32 I2S音频总线学习笔记(二):I2S读取INMP441音频数据

简介 在这个系列的上一篇文章中&#xff0c;我们介绍了ESP32 I2S音频总线的相关知识&#xff0c;简要了解了什么是I2S总线、它的通信格式&#xff0c;以及相关的底层API函数。没有看过上篇文章的可以点击文章进行回顾&#xff1a; ESP32 I2S音频总线学习笔记&#xff08;一&a…

一文简单回顾Java中的String、StringBuilder、StringBuffer

简单说下String、StringBuilder、StringBuffer的区别 String、StringBuffer、StringBuilder在Java中都是用于处理字符串的&#xff0c;它们之间的区别是String是不可变的&#xff0c;平常开发用的最多&#xff0c;当遇到大量字符串连接的时候&#xff0c;就用StringBuilder&am…

matlab中,fill命令用法

在 MATLAB 中&#xff0c;fill 命令用于创建填充多边形的图形对象。使用 fill 可以在二维坐标系中绘制填充的区域&#xff0c;通常用于绘制图形的背景或显示数据分布。 基本语法 fill(X, Y, C)X 和 Y 是同样长度的向量&#xff0c;定义了多边形的顶点坐标。C 是颜色&#xff0…

计算机网络之链路层

本文章目录结构出自于《王道计算机考研 计算机网络_哔哩哔哩_bilibili》 02 数据链路层 在网上看到其他人做了详细的笔记&#xff0c;就不再多余写了&#xff0c;直接参考着学习吧。 1 详解数据链路层-数据链路层的功能【王道计算机网络笔记】_wx63088f6683f8f的技术博客_51C…

lib.exe正确用法winhv.lib生成方法

lib.exe /def:winhv.def /OUT:winhv.lib /machine:x64 winhv.def注意是 winhv.sys要不然会变成dll LIBRARY winhv.sys EXPORTSWinHvAllocateOverlayPagesWinHvDisablePartitionVtlWinHvDisableVpVtlWinHvEnablePartitionVtlWinHvEnableVpVtlWinHvFreeOverlayPagesWinHvGetCurr…

react-bn-面试

1.主要内容 工作台待办 实现思路&#xff1a; 1&#xff0c;待办list由后端返回&#xff0c;固定需要的字段有id(查详细)、type(本条待办的类型)&#xff0c;还可能需要时间&#xff0c;状态等 2&#xff0c;一个集中处理待办中转路由页&#xff0c;所有待办都跳转到这个页面…

Linux:一切皆文件

**文件描述符**&#xff1a;它是一种特殊的索引&#xff0c;本质上是进程中file_struct结构体成员fd_array数组的下标。在Linux等系统中&#xff0c;文件描述符是一个非负整数&#xff0c;用于标识打开的文件&#xff0c;是内核为了高效管理已被打开的文件所创建的索引。通过文…

【物联网】ARM核常用指令(详解):数据传送、计算、位运算、比较、跳转、内存访问、CPSR/SPSR、流水线及伪指令

文章目录 指令格式&#xff08;重点&#xff09;1. 立即数2. 寄存器位移 一、数据传送指令1. MOV指令2. MVN指令3. LDR指令 二、数据计算指令1. ADD指令1. SUB指令1. MUL指令 三、位运算指令1. AND指令2. ORR指令3. EOR指令4. BIC指令 四、比较指令五、跳转指令1. B/BL指令2. l…

项目集成Nacos

文章目录 1.环境搭建1.创建模块 sunrays-common-cloud-nacos-starter2.目录结构3.pom.xml4.自动配置1.NacosAutoConfiguration.java2.spring.factories 5.引入cloud模块通用依赖 2.测试1.创建模块 sunrays-common-cloud-nacos-starter-demo2.目录结构3.pom.xml4.application.ym…

QT交叉编译环境搭建(Cmake和qmake)

介绍一共有两种方法&#xff08;基于qmake和cmake&#xff09;&#xff1a; 1.直接调用虚拟机中的交叉编译工具编译 2.在QT中新建编译套件kits camke和qmake的区别&#xff1a;CMake 和 qmake 都是自动化构建工具&#xff0c;用于简化构建过程&#xff0c;管理编译设置&…