【spring】@ControllerAdvice注解学习

@ControllerAdvice介绍

@ControllerAdvice 是 Spring 框架提供的一个注解,用于定义一个全局的异常处理类或者说是控制器增强类(controller advice class)。这个特性特别适用于那些你想应用于整个应用程序中多个控制器的共有行为,比如全局异常处理、数据绑定、响应处理等。通过使用 @ControllerAdvice,你可以避免在每个控制器中重复相同的代码,从而提高代码的可维护性和整洁性。

@ControllerAdvice源码

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface ControllerAdvice {@AliasFor(annotation = Component.class, attribute = "value")String name() default "";@AliasFor("basePackages")String[] value() default {};@AliasFor("value")String[] basePackages() default {};Class<?>[] basePackageClasses() default {};Class<?>[] assignableTypes() default {};Class<? extends Annotation>[] annotations() default {};}
源代码截图

@ControllerAdvice属性介绍

  • name(): 这是一个继承自 @Component 的属性,默认值为空字符串。可以为 Bean 指定一个名称,便于在 Spring 上下文中引用。

  • value()basePackages()(以及它们之间的 @AliasFor): 这两个属性是等效的,用于指定哪些包下的控制器类应受此 advice 管理。默认值为空数组,意味着如果不指定,则对所有包的控制器生效。

    @ControllerAdvice(basePackages = {"com.chengxuyuan.controller"})。

  • basePackageClasses(): 与指定包名不同,这个属性允许通过指定类来确定包的基点。Spring 会查找这些类所在的包及子包下的控制器应用此 advice。

  • assignableTypes(): 允许你指定一个或多个类(类型数组),只有继承或实现了这些类的控制器才会受到此 advice 影响。

    @ControllerAdvice(assignableTypes = {DemoCustomController.class})。

  • annotations(): 虽然你的代码示例中包含了此属性,但在 Spring Framework 的实际 @ControllerAdvice 定义中,并没有直接包含 annotations 属性来基于注解匹配控制器。这个概念可能源自于对 AOP 或其他自定义扩展方式的理解,但它不是标准 @ControllerAdvice 的一部分。此属性用于说明如果要根据控制器上的特定注解来应用 advice,理论上可以通过自定义逻辑来实现

@ControllerAdvice注解使用场景

  • 全局异常处理

    • 你可以结合 @ExceptionHandler 注解,在 @ControllerAdvice 标注的类中定义方法来处理特定类型的异常。这些异常处理方法会应用到标记有 @RequestMapping 的所有控制器方法上,从而实现全局异常处理机制。
  • 模型属性添加

    • 使用 @ModelAttribute 注解可以在每次请求处理之前向模型中添加属性。这样,你可以在不修改每个控制器方法的情况下,为所有(或指定包下的)控制器添加共享数据。
  • 全局数据绑定和验证

    • 可以通过 @InitBinder 方法自定义数据绑定和验证逻辑,影响所有控制器中的数据绑定行为。
  • 响应体处理

    • 虽然不直接是 @ControllerAdvice 的一部分,但结合 @ResponseBody 和 ResponseEntity,可以用来定制全局的响应体处理逻辑,比如统一设置响应头或响应状态码。
  • 特定控制器或包的应用

    • 通过使用 basePackages 或  assignableTypes 属性,可以指定 @ControllerAdvice 应用于哪些特定的控制器或包下的控制器,而不是全局所有。

@ControllerAdvice测试示例代码

示例代码 一
@ControllerAdvice
public class GlobalControllerAdvice {/*** 全局异常处理*/@ExceptionHandler(Exception.class)public ModelAndView handleException(Exception ex) {ModelAndView modelAndView = new ModelAndView("error");modelAndView.addObject("errorMessage", ex.getMessage());return modelAndView;}/*** 全局数据绑定*/@InitBinderpublic void initBinder(WebDataBinder binder) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");dateFormat.setLenient(false);binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));}/*** 全局模型属性*/@ModelAttribute("appName")public String appName() {return "Demo Application";}
}




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

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

相关文章

ctfhub中的SSRF的相关例题(下)

目录 URL Bypass 知识点 相关例题 数字IP Bypass 相关例题 方法一&#xff1a;使用数字IP 方法二&#xff1a;转16进制 方法三&#xff1a;用localhost代替 方法四&#xff1a;特殊地址 302跳转 Bypass ​编辑 关于localhost原理: DNS重绑定 Bypass 知识点&…

ant design pro 6.0搭建教程

一、搭建 环境&#xff1a; Node.js 18.16.1 ant design pro 6.0 注意&#xff1a;选择umi3时&#xff0c;使用node.js 18版本的会报错&#xff0c;可以实践一下&#xff0c;这里就不再进行实践了。 umi3需要版本是低于node.js 18的 node下载地址&#xff1a; https://nodejs.…

可重构柔性装配产线,为智能制造领域带来了新的革命性变革

随着科技的飞速发展&#xff0c;个性化需求逐渐成为市场的主导。在这个充满变革的时代&#xff0c;制造业正面临着前所未有的挑战和机遇。如何快速响应市场需求、提高生产效率、保证产品质量&#xff0c;成为每一家制造企业必须思考的问题。 在这样的背景下&#xff0c;富唯智…

免费插件集-illustrator插件-Ai插件-文本对象和文本段落互转

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;进行文本对象和文本段落互转。首先从下载网址下载这款插件 https://download.csdn.net/download/m0_67316550/878…

00.OpenLayers快速开始

00OpenLayers快速开始 官方文档&#xff1a; 快速开始&#xff1a;https://openlayers.org/doc/quickstart.html 需要node环境 一、设置新项目 npm create ol-app my-app cd my-app npm start第一个命令将创建一个名为 my-app​ 的目录&#xff08;如果您愿意&#xff0c;…

Java——简易图书管理系统

本文使用 Java 实现一个简易图书管理系统 一、思路 简易图书管理系统说白了其实就是 用户 与 图书 这两个对象之间的交互 书的属性有 书名 作者 类型 价格 借阅状态 而用户可以分为 普通用户 管理员 使用数组将书统一管理起来 用户对这个数组进行操作 普通用户可以进…

有趣的css - 圆形背景动效多选框

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是用 css 实现一个圆形背景动效多选框&#xff0c;适用提醒用户勾选场景&#xff0c;突出多选框选项&#xff0c;可以有效增加用户识别度。 最新文章通过公众号「设计师工作日常」发布…

VBA批量合并带有图片、表格与文本框的Word

本文介绍基于VBA语言&#xff0c;对大量含有图片、文本框与表格的Word文档加以批量自动合并&#xff0c;并在每一次合并时添加分页符的方法。 在我们之前的文章基于Python中docx与docxcompose批量合并多个Word文档文件并逐一添加分页符&#xff08;https://blog.csdn.net/zhebu…

helloworld 可执行程序得到的过程

// -E 预处理 开发过程中可以确定某个宏 // -c 把预处理 编译 汇编 都做了,但是不链接 // -o 指定输出文件 // -I 指定头文件目录 // -L 指定链接库文件目录 // -l 指定链接哪一个库文件 #include <stdio.h> #include <stdlib.h> #include <string.h>int mai…

【微积分】CH16 integrals and vector fields听课笔记

【托马斯微积分学习日记】13.1-线积分_哔哩哔哩_bilibili 概述 16.1line integrals of scalar functions [中英双语]可视化多元微积分 - 线积分介绍_哔哩哔哩_bilibili 16.2vector fields and line integrals&#xff1a; work circulation and flux 向量场差不多也是描述某种…

gpt-4o继续迭代考场安排程序 一键生成考场清单

接上两篇gpt-4o考场安排-CSDN博客&#xff0c;考场分层次安排&#xff0c;最终exe版-CSDN博客 当然你也可以只看这一篇。 今天又添加了以下功能&#xff0c;程序见后。 1、自动分页&#xff0c;每个考场打印一页 2、添加了打印试场单页眉 3、添加了页脚 第X页&#xff0c;…

Leetcode刷题笔记1:数组基础1

导语 leetcode刷题笔记记录&#xff0c;本篇博客记录数组基础1部分的题目&#xff0c;主要题目包括&#xff1a; Leetcode 704 二分查找Leetcode 27 移除元素 知识点 二分查找 原理 二分查找的适用对象为有序数组且数组中无重复元素&#xff0c;其主要原理是每次都从有序…

AI视频教程下载:全面掌握ChatGPT和LangChain开发AI应用(附源代码)

这是一门深入的课程&#xff0c;涉及ChatGPT、LangChain和Python。打造专注于现实世界AI集成的AI应用&#xff0c;课件附有每一节涉及到的源代码。 **你将学到什么&#xff1a;** - 将ChatGPT集成到LangChain的生产风格应用中 - 使用LangChain组件构建复杂的文本生成管道 - …

推荐五个线上兼职,在家也能轻松日入百元,适合上班族和全职宝妈

在这个瞬息万变的时代&#xff0c;你是否也曾考虑过在繁忙的工作之外&#xff0c;寻找一份兼职副业来补贴家用&#xff0c;同时保持生活的多样性&#xff1f;别急&#xff0c;现在就让我为你揭秘五个可靠的日结线上兼职岗位&#xff0c;助你轻松迈向财务自由之路&#xff01; 一…

云WAF与传统WAF:网络安全的双重防线

在网络安全领域&#xff0c;Web应用防火墙&#xff08;WAF&#xff09;是守护企业网络安全的重要盾牌。随着云计算技术的迅猛发展&#xff0c;云WAF作为一种新型的安全服务模式&#xff0c;正逐渐成为企业网络安全防护的新宠。本文将深入探讨云WAF与传统WAF的区别&#xff0c;分…

使用 Flask 和 Celery 构建异步任务处理应用

文章目录 什么是 Flask&#xff1f;什么是 Celery&#xff1f;如何在 Flask 中使用 Celery&#xff1f;步骤 1&#xff1a;安装 Flask 和 Celery步骤 2&#xff1a;创建 Flask 应用程序步骤 3&#xff1a;运行 Celery Worker步骤 4&#xff1a;启动 Flask 应用程序 结论 在构建…

高校网站群及融媒体中心建设方案

一、项目背景 随着信息技术的飞速发展&#xff0c;互联网已成为高校展示形象、传播信息、服务师生、沟通社会的重要渠道。然而&#xff0c;目前许多高校在网站建设和媒体传播方面存在以下问题&#xff1a; 网站分散、缺乏统一规划&#xff1a;各高校内部往往存在多个部门或学院…

零拷贝(Zero-Copy)

1.背景 现在有这样一个场景&#xff0c;我们需要在本地选择一个文件后&#xff0c;然后上传到网络上。 我们再看看文件的内容数据的具体搬运过程&#xff1a; 你会发现&#xff0c;在整个文件搬运的过程中&#xff0c;发生了多次的数据拷贝和上下文转换。 4次数据拷贝&#…

深入探索:移动云服务器的强大之处

文章目录 一 什么是移动云二 移动云服务器的使用三 移动云服务器的优点四 在移动云上部署node.js项目五 移动云服务器的应用场景六 移动云服务器的使用体验总结 一 什么是移动云 移动云是指用户可以通过移动设备访问云端的数据和应用&#xff0c;无需在本地设备上进行存储和处…