@RestControllerAdvice 的作用

系列博客目录


文章目录

  • 系列博客目录
  • 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 {@InitBinderpublic 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*/@ExceptionHandlerpublic 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.mzph.cn/bicheng/69486.shtml

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

相关文章

代码随想录算法训练营第三十八天-动态规划-完全背包-279.完全平方数

把目标值当作背包容量&#xff0c;每个平方数当作物品&#xff0c;题目变更为装满指定容量的背包&#xff0c;最小用几个物品会不会出现拼凑不出来的情况&#xff1f;不会&#xff0c;因为有数字1&#xff0c;对任意正整数百分百能拼凑出来因此此题目与上一道题就变得一模一样了…

Python帝王學集成-母稿

引用:【【全748集】这绝对是2024最全最细的Python全套教学视频,七天看完编程技术猛涨!别再走弯路了,从零基础小白到Python全栈这一套就够了!-哔哩哔哩】 https://b23.tv/lHPI3XV 语法基础 Python解释器与pycharm编辑器安装 - 定义:Python解释器负责将Python代码转换为计…

springboot 动态配置定时任务

要在Spring Boot中动态配置定时任务&#xff0c;可以使用ScheduledTaskRegistrar类来实现。 首先&#xff0c;创建一个定时任务类&#xff0c;该类需要实现Runnable接口。例如&#xff1a; Component public class MyTask implements Runnable {Overridepublic void run() {/…

LibreChat

文章目录 一、关于 LibreChat✨特点 二、使用LibreChat&#x1fab6;多合一AI对话 一、关于 LibreChat LibreChat 是增强的ChatGPT克隆&#xff1a;Features Agents, Anthropic, AWS, OpenAI, Assistants API, Azure, Groq, o1, GPT-4o, Mistral, OpenRouter, Vertex AI, Gemi…

基础项目实战——3D赛车(c++)

目录 前言一、渲染引擎二、关闭事件三、梯形绘制四、轨道绘制五、边缘绘制六、草坪绘制七、前后移动八、左右移动​九、曲线轨道​十、课山坡轨道​十一、循环轨道​十二、背景展示​十三、引入速度​十四、物品绘制​十五、课数字路障​十六、分数展示​十七、重新生成​十八、…

Python 数据清洗与处理常用方法全解析

在数据处理与分析过程中&#xff0c;缺失值、重复值、异常值等问题是常见的挑战。本文总结了多种数据清洗与处理方法&#xff1a;缺失值处理包括删除缺失值、固定值填充、前后向填充以及删除缺失率高的列&#xff1b;重复值处理通过删除或标记重复项解决数据冗余问题&#xff1…

OpenBMC:编译

1.安装依赖 OpenBMC是基于Yocto搭建的&#xff0c;基于不同的OS预先需要安装的依赖包和工具&#xff0c;清参考&#xff1a; 1 System Requirements — The Yocto Project 5.1.999 documentation 2.下载代码 OpenBMC的源码位于&#xff1a; openbmc/openbmc: OpenBMC Distri…

【C++】设计模式详解:单例模式

文章目录 Ⅰ. 设计一个类&#xff0c;不允许被拷贝Ⅱ. 请设计一个类&#xff0c;只能在堆上创建对象Ⅲ. 请设计一个类&#xff0c;只能在栈上创建对象Ⅳ. 请设计一个类&#xff0c;不能被继承Ⅴ. 请设计一个类&#xff0c;只能创建一个对象&#xff08;单例模式&#xff09;&am…

AAPM:基于大型语言模型代理的资产定价模型,夏普比率提高9.6%

“AAPM: Large Language Model Agent-based Asset Pricing Models” 论文地址&#xff1a;https://arxiv.org/pdf/2409.17266v1 Github地址&#xff1a;https://github.com/chengjunyan1/AAPM 摘要 这篇文章介绍了一种利用LLM代理的资产定价模型&#xff08;AAPM&#xff09;…

《网络数据安全管理条例》施行,企业如何推进未成年人个人信息保护(下)

文章目录 前言三、全流程推进未成年人个人信息保护1、处理前:未成年人个人信息处理的告知同意2、处理中:加强个人信息处理流程管理3、处理后:落实个人信息保护合规审计四、大型网络平台应每年发布社会责任报告前言 《网数条例》颁布前,我国已针对未成年人个人信息保护陆续…

games101-(5/6)

光栅化 投影完成之后&#xff0c;视图区域被确定在从[-1,1]的单位矩阵中&#xff0c;下一步就是光栅化 长宽比&#xff1a;ratio 垂直的可视角度&#xff1a;fild-of-view 可以看到的y 轴的范围&#xff0c;角度越小 越接近正交投影 屏幕坐标系 、 将多边形转化成像素 显示…

01学习预热篇(D6_正式踏入JVM深入学习前的铺垫)

目录 学习前言 一、虚拟机的结构 1. Java虚拟机参数设置 2. java 堆 3. 出入栈 4. 局部变量表 1> 局部变量的剖析 2> 局部变量的回收 5. 操作数栈 1> 常量入栈指令 2> 局部变量值转载到栈中指令 3> 将栈顶值保存到局部变量中指令 6. 帧数据区 7. 栈…

在亚马逊云科技上用Stable Diffusion 3.5 Large生成赛博朋克风图片(下)

背景介绍 在2024年的亚马逊云科技re:Invent大会上提前预告发布的Stable Diffusion 3.5 Large&#xff0c;现在已经在Amazon Bedrock上线了&#xff01;各位开发者们现在可以使用该模型&#xff0c;根据文本提示词文生图生成高质量的图片&#xff0c;并且支持多种图片风格生成&…

Redis学习之哨兵二

一、API 1.sentinel masters:展示被监控的主节点状态及相关的统计信息 2.sentinel master <master name>:展示指定的主节点的状态以及相关的统计信息 3.sentinel slaves <master name>:展示指定主节点的从节点状态以及相关的统计信息 4.sentinel sentinels <mas…

洛谷U525322 优美区间

优美区间 题目描述 有一个长度为 n n n 的数字序列&#xff0c;序列的第 i i i 个数为 a i a_i ai​。 定义区间 [ l , r ] [l,r] [l,r] 的优美程度为 gcd ⁡ ( a l , a l 1 , … , a r ) ∑ i l r a i \gcd(a_l,a_{l1},\dots,a_r)\times\sum\limits_{il}^ra_i gcd(…

如何把obsidian的md文档导出成图片,并加上文档属性

上篇关于这个插件PKMer_Obsidian 插件&#xff1a;Export Image plugin 一键将笔记转换为图片分享的文章 如何把obsidian的md文档导出成图片&#xff0c;并加上水印-CSDN博客 如何导出图片的时候让文档属性也显示出来&#xff0c;啊啊&#xff0c;这个功能找了一晚上&#xf…

新年祝词(原创)

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

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.19 排序革命:argsort的十大高阶用法

1.19 排序革命&#xff1a;argsort的十大高阶用法 目录 #mermaid-svg-Qu8PcmLkIc1pOQJ7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Qu8PcmLkIc1pOQJ7 .error-icon{fill:#552222;}#mermaid-svg-Qu8PcmLkIc1pOQJ…

TensorFlow实现逻辑回归模型

逻辑回归是一种经典的分类算法&#xff0c;广泛应用于二分类问题。本文将介绍如何使用TensorFlow框架实现逻辑回归模型&#xff0c;并通过动态绘制决策边界和损失曲线来直观地观察模型的训练过程。 数据准备 首先&#xff0c;我们准备两类数据点&#xff0c;分别表示两个不同…

Unity git版本管理

创建仓库的时候添加了Unity的.gitignore模版&#xff0c;在这个时候就能自动过滤不需要的文件 打开git bash之后&#xff0c;步骤git版本管理-CSDN博客 如果报错&#xff0c;尝试重新进git 第一次传会耗时较长&#xff0c;之后的更新就很快了