
@ControllerAdvice用法
发布日期:2025-03-28 12:17:46
浏览次数:6
分类:精选文章
本文共 2415 字,大约阅读时间需要 8 分钟。
@ControllerAdvice 是 Spring 3.2 提供的一个新注解,从名字上可以看出它主要用来增强控制器的功能。接下来,我会详细解释 @ControllerAdvice 的实现机制以及如何在项目中使用它。
点滴解释
取向
- @ControllerAdvice 属于全局性的处理:它允许我们不需要在每个请求中添加重复代码,而是将全局配置集中在一个地方。常见的场景包括异常处理、数据绑定初始化以及模型属性设置等。
- 默认行为:如果没有特别指定,就像 @ExceptionHandler、@InitBinder 和 @ModelAttribute 这些注解一样,默认会作用于注解了 @RequestMapping 的控制器方法。
工作原理
组件扫描配置:
- 在 Spring MVC 的配置文件中,需要使用
<context:component-scan>
标签来启用组件扫描。 - 假设你的组件扫描使用如下配置:
这样就能让 Spring 找到并处理同时注解了
@ControllerAdvice
的控制器类。
如何定制全局配置:
- @ExceptionHandler:用于处理异常。默认情况下,它会作用于所有控制器方法。如果只想为某一类异常定义全局处理,可以在类上使用 @ControllerAdvice 注解。
- @InitBinder:用于初始化数据绑定器。它会在每次请求开始时运行,可以用来自动绑定前台请求参数到模型中。
- @ModelAttribute:可以用来添加全局的键值对,所有注解了
@RequestMapping
的方法都能访问这些键值对。
注解示例:
@ControllerAdvicepublic class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ModelAndView handleException(Exception e) { ModelAndView mv = new ModelAndView("error"); mv.addObject("message", e.getMessage()); return mv; } @InitBinder public void initBinder(WebDataBinder binder) { // 在这里可以初始化自定义的数据绑定器 } @ModelAttribute public void addModelAttribute(@ModelAttribute Model model) { model.addAttribute("globalMessage", "这是一个全局的消息"); }}
实现细节
注解属性:
value()
和basePackages()
用于指定要扫描的基础包路径。basePackageClasses()
用于指定具体的类路径。annotations()
用于自定义注解进行扩展。
特性
- 配置集成化:@ControllerAdvice 允许我们在一个类中集中配置多种注解。
- 灵活性:可以在需要的地方单独添加注解,而不影响其他地方。
操作步骤
导入必要的类:确保在使用这些注解时导入了正确的包:
import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.servlet.ModelAndView;
创建 GlobalControllerAdvice 类:
@ControllerAdvicepublic class GlobalControllerAdvice { // 你可以在这里添加全局配置}
在你的控制器中使用它:
@Controller@RequestMapping(value = "/greeting", method = RequestMethod.GET)public String greeting(@ModelAttribute("message") String message) { return "Hello, " + message;}
常用问题
Q: 为什么我的 @ControllerAdvice 不起作用?
A: 检查是否在 @ComponentScan
中包含了 org.springframework.web.bind.annotation\ControllerAdvice。
Q: 应用多个 @ControllerAdvice 到同一个控制器类怎么办?
A: 如果一个控制器类注解了多个 @ControllerAdvice,可以分别指定它们的作用范围。例如:
@ ControllerAdvice defaultedGlobal = ...@ ControllerAdvice(globalSpecific = ...) public class MyController { // 方法会被不同的 @ControllerAdvice 处理}
Q: 是否必须在所有控制器中都使用 @ControllerAdvice?
A: 不是。只有注解了 @ControllerAdvice 或 @RequestMapping 的控制器方法才会受到影响。如果不需要全局配置,可以选择仅对需要的类使用它。
通过上述步骤,你可以轻松地将 @ControllerAdvice 应用到项目中,实现多种控制器行为的统一管理与配置。
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年04月26日 14时06分07秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
49天精通Java,第28天,Java lambda表达式
2023-01-23
500套精美Logo样机模板可直接套用、轻松制作炫酷logo
2023-01-23
centos7上安装 mysql
2023-01-23
5小时内使用DeepSeek写出一篇优质论文的三步攻略指南
2023-01-23
60天新媒体公众号写作秘诀
2023-01-23
C#多线程编程系列(五)- 使用任务并行库
2023-01-23
ASP.NET MVC4 json序列化器
2023-01-23
Android 版本更新之打开apk文件的前生今世
2023-01-23
6410_Linux系统系统移植 和 驱动加载
2023-01-23
64位WIN7+oracle11g+plsql安装
2023-01-23
6天掌握mysql基础视频教程
2023-01-23
7 Tips For Better JDeveloper Experience
2023-01-23
70. 爬楼梯
2023-01-23
7B2 PRO主题5.4.2免授权直接安装
2023-01-23
7大常用JCL 模板
2023-01-23
111
2023-01-23
80个Python经典资料(教程+源码+工具)汇总——下载目录
2023-01-23
80个Python经典资料(教程+源码+工具)汇总——下载目录
2023-01-23
8个微信实用技巧,你知道多少?
2023-01-23