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

【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";}
}




相关文章:

  • 【设计模式】桥接模式
  • 小皮面板中访问不了本地的sqli网站---解决方法
  • 【Andoird开发】android获取蓝牙权限,搜索蓝牙设备MAC
  • Reactor设计模式
  • P3128 [USACO15DEC] Max Flow P题解(树上差分,最近公共祖先,图论)
  • Golang | Leetcode Golang题解之第111题二叉树的最小深度
  • Python | Leetcode Python题解之第111题二叉树的最小深度
  • Python基础学习笔记(七)——元组
  • python从入门到精通02
  • SELINUX=enforcing时无法启动httpd服务的解决方案(semanage命令以及setroubleshoot-server插件的妙用)
  • 门禁-jenkins的构建状态同步到gitlab提交流水线
  • C++中的模板类的定义与使用
  • win11 通过防火墙设置-开通本地端口
  • Linux Tcpdump抓包入门
  • 汇编实现的操作系统
  • 【comparator, comparable】小总结
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • AHK 中 = 和 == 等比较运算符的用法
  • angular2开源库收集
  • C++类的相互关联
  • canvas 绘制双线技巧
  • ES6核心特性
  • LeetCode18.四数之和 JavaScript
  • Less 日常用法
  • Netty 4.1 源代码学习:线程模型
  • uni-app项目数字滚动
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • XForms - 更强大的Form
  • 初识 webpack
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 聊聊directory traversal attack
  • 聊一聊前端的监控
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 函数计算新功能-----支持C#函数
  • 组复制官方翻译九、Group Replication Technical Details
  • (07)Hive——窗口函数详解
  • (1)(1.13) SiK无线电高级配置(五)
  • (2)Java 简介
  • (AngularJS)Angular 控制器之间通信初探
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (函数)颠倒字符串顺序(C语言)
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (一)SpringBoot3---尚硅谷总结
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (轉)JSON.stringify 语法实例讲解
  • (状压dp)uva 10817 Headmaster's Headache
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • 、写入Shellcode到注册表上线
  • .gitignore
  • .NET Core 项目指定SDK版本
  • @Autowired自动装配
  • [Android]竖直滑动选择器WheelView的实现
  • [CF407E]k-d-sequence