@ControllerAdvice 未触发

2024-04-21

我正在开发 Spring MVC/Webflow 应用程序(版本 3.2),并尝试进行异常处理,我可以将自定义异常消息输出到日志文件和 error.jsp。我遇到的问题是异常处理程序没有被解雇。我创建了以下类并对其进行了注释“@ControllerAdvice”并将其放入与抛出异常的控制器相同的包中:

@ControllerAdvice
public class MyCustomExceptionController {

    @ExceptionHandler(MyCustomException.class)
    public ModelAndView handleMyException(MyCustomException ex) {   
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("/error/error");
        modelAndView.addObject("errorId", ex.getErrorId());
        modelAndView.addObject("message", ex.getErrorMessage());        
        return modelAndView;
    }
}

并将以下内容添加到 mvc-config 文件中:

<mvc:annotation-driven/>

并在我的应用程序配置文件中包含以下内容:

<context:component-scan base-package="package containing my controllers and MyCustomExceptionController">
        <context:include-filter type="annotation" 
    expression="org.springframework.web.bind.annotation.ControllerAdvice" />
    </context:component-scan> 

有什么想法为什么这不起作用吗?


The <mvc:annotation-driven/>元素隐式注册一个ExceptionHandlerExceptionResolver豆。这个类有一个initExceptionHandlerAdviceCache()扫描上下文中的 bean 以查找其类类型注释为的 bean 的方法@ControllerAdvice.

它通过首先调用来做到这一点ControllerAdviceBean.findAnnotatedBeans(ApplicationContext) http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/method/ControllerAdviceBean.html#findAnnotatedBeans-org.springframework.context.ApplicationContext-。在内部,该方法使用ApplicationContext#getBeanDefinitionNames() http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/ListableBeanFactory.html#getBeanDefinitionNames--。该方法的 javadoc 指出

不考虑该工厂可能参与的任何层次结构

为了澄清这意味着什么。当你声明一个ContextLoaderListener在您的部署描述符中,它加载我们所说的根或应用程序ApplicationContext并使其可以在ServletContext。当你随后声明一个DispatcherServlet,它创建了自己的servlet ApplicationContext并使用任何ApplicationContext它发现在ServletContext加载的属性ContextLoaderListener作为该上下文的父级。层次结构看起来像这样

Root ApplicationContext // loaded by the ContextLoaderListener
            |
Servlet ApplicationContext // loaded by the DispatcherServlet

Every ApplicationContext可以访问父上下文中的 bean,但反之则不行。

上面的方法选择不使用父上下文中的bean,因此只能访问当前上下文中的beanApplicationContext (BeanFactory真的吗)。

因此,如果您的

<context:component-scan .../>

在根中声明ApplicationContext正如我从名字中假设的那样app-config,但是

<mvc:annotation-driven />

在servlet中声明ApplicationContext,再次假设从mvc-config,那么ExceptionHandlerExceptionResolver寻找@ControllerAdvice豆子将找不到任何。它正在 servlet 上下文中寻找 bean,但它们不在那里,而是在根上下文中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

@ControllerAdvice 未触发 的相关文章

随机推荐

  • 如果不刷新页面,Vuex 状态不会更新

    我正在构建一个单页面应用程序 用户可以根据他们是否登录来看到不同的页面 登录调用工作正常 授权令牌保存在本地存储中 设置 我已经设置了一个名为的吸气剂loggedIn返回true如果在状态上设置了令牌 这是我的确切代码auth js商店模块
  • 将十六进制字符串转换为无符号整数 (VBA)

    在 MS ACCESS VBA 中 我通过在字符串前加上 前缀将十六进制字符串转换为十进制 CLng h1234 4660 CLng h80000000 2147483648 我应该怎么做才能将其转换为无符号整数 使用 CDbl 也不起作用
  • 在均匀网格上查找到点云中最近点的距离

    我有一个大小为 AxBxC 的 3D 网格 网格中的点之间的距离 d 相等 给定多个点 考虑到以下假设 找到每个网格点到最近点的距离 每个网格点应包含到点云中最近点的距离 的最佳方法是什么 假设 A B 和 C 相对于 d 来说相当大 给出
  • Python正则表达式查找大括号的所有大小写,包括括号

    我想查找并替换双大括号内的字符串 包括括号本身 例如 a href hello a 理想情况下应该返回 hello 我发现了这个表达 here https stackoverflow com questions 10643553 pytho
  • Android上如何使用UID获取用户名?

    我有几个这样的UID 10022 10011 1000 其实我知道他们的用户名是u0 a22 u0 a11 system 但问题是 如何使用UID获取用户名呢 没有 etc passwd根本没有文件 我编写了一个实用程序类 通过硬编码值来获
  • 仅出现在存档的 Mac OS X 产品中的错误

    我和我的朋友正在为 Mac 应用商店开发一个应用程序 我们将其提交给应用程序商店 但苹果以我们以前从未遇到过的错误为由拒绝了它 我们很难重现该错误 但经过一段时间的调试后 我们发现该错误仅出现在存档产品中 该错误的症状是 我们应用程序中的某
  • 将数据从 csv 复制到 D3 中的数组中

    我知道这个问题以前曾被问过 但由于某种原因 他们的解决方案对我不起作用 我正在尝试使用 CSV 文件中的数据填充两个数组 其中 name value alpha 34 beta 12 delta 49 gamma 89 我现在正在尝试的是
  • 如何单击表格单元格并显示带有注释的模式

    我对编程相当感兴趣 并且已经在一个问题上被阻止了几天 我有一个包含 2 列的表 记录 和每条记录的注释 注释 通常很长 因此我计划在 注释 列上的每个单元格上建立一个链接 并链接到显示注释的模式 我面临的问题是所有链接都会显示表格第一项的注
  • 使用超出范围的变量

    我正在制作一个响应式背景视频 我有这个代码
  • Silverlight、RIA 服务、MVC2P2 = 无数据

    我在升级当前项目以使用 RIA 服务时遇到问题 我添加了所有必要的 web config 更改 但仍然没有运气 我一切都编译得很好 但是当我使用数据上下文点击页面时 我收到错误 我用 fiddler 进行了调试 并且在其中一个请求上收到了
  • 如何在 Aqua Data Studio 中导出注册的服务器设置?

    有谁知道如何在 Aqua Data Studio 中导出注册服务器 也许有一些棘手的方法可以通过复制一些 ini 文件或注册表项来完成此操作 AD Studio 服务器注册位于 USER HOME datastudio connection
  • MySQL - 行计数和左连接问题

    我有 2 个表 活动和活动代码 营销活动 id partner id 状态 Campaign codes ID 代码 状态 我想要获取所有营销活动的所有营销活动代码的计数 其中营销活动代码 status 等于 0 或营销活动没有营销活动代码
  • 使用 jQuery 获取语法错误 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions Add a
  • Android 相当于 iPhone 的“添加到主屏幕”吗?

    我正在开发一个移动网络应用程序 目前我有一段 jQuery 代码 用于检查应用程序是否全屏运行 if window navigator standalone content before div class notice To enjoy
  • XSD 架构和 JAXB 类中的多态性

    我有一个像这样的xml
  • 如何防止 SVN 缓存单个存储库的凭据?

    我正在使用 Collabnet SVN 客户端版本 1 5 和 1 6 我的本地计算机运行的是 Windows Vista x64 我知道 确实非常悲伤 我想每次尝试在选定的存储库上执行任何颠覆操作时都强制进行身份验证 我如何将属性或设置设
  • 用于将 格式的 unicode 字符转换为其 ASCII 等效项的脚本

    我正在对 Linux 区域设置文件进行一些更改 usr share i18n locales 如 pt BR 更改日期 时间 数字等的默认格式 但是由于 unicode 字符在
  • 使用 Angular FormArray 计算值

    我正在尝试根据 FormArray 中的特定值计算总计或其他值 我发现订阅时valueChanges并尝试将整个数组传递给类似的东西reduce 新值 不存在于父 FormGroup 中 StackBlitz 上的原始示例 https st
  • 如何确定 C 中数组的大小?

    如何确定 C 中数组的大小 即数组可以容纳多少个元素 执行摘要 int a 17 size t n sizeof a sizeof a 0 完整答案 要确定数组的大小 以字节为单位 您可以使用sizeof操作员 int a 17 size
  • @ControllerAdvice 未触发

    我正在开发 Spring MVC Webflow 应用程序 版本 3 2 并尝试进行异常处理 我可以将自定义异常消息输出到日志文件和 error jsp 我遇到的问题是异常处理程序没有被解雇 我创建了以下类并对其进行了注释 Controll