博客
关于我
@ControllerAdvice用法
阅读量:788 次
发布时间:2023-01-23

本文共 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 应用到项目中,实现多种控制器行为的统一管理与配置。

    转载地址:http://lseyk.baihongyu.com/

    你可能感兴趣的文章
    勒索病毒Kraken2.0.7分析
    查看>>
    MySQL错误1366处理方法
    查看>>
    驱动程序之_1_字符设备_13_USB设备_1_基本概念
    查看>>
    微机原理 6-计算机中常用的数制
    查看>>
    window系统下安装使用curl命令工具
    查看>>
    假如计算机是中国人发明的,那代码应该这么写
    查看>>
    神器 Codelf !
    查看>>
    趣图:会算法和不会算法的区别
    查看>>
    区块链会2020再次爆发,先学点DAPP压压惊,跟我一起学《区块链DApp入门实战》
    查看>>
    问题解决28:微信网页授权出现redicet_uri 参数错误
    查看>>
    LeakCanary 中文使用说明
    查看>>
    反转链表,(5)
    查看>>
    Camera (api1)的打开过程
    查看>>
    wxwidgets绘图
    查看>>
    wxwidgets事件处理
    查看>>
    用OpenCv转换原始图像数据到wximage
    查看>>
    codeblocks下wxWidgets编译与配置
    查看>>
    OpenCv+wxwidgets尝试
    查看>>
    wxwidgets自定义事件+调试
    查看>>
    wxwidgets编写多线程程序--wxThread
    查看>>