首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring @Controller异常处理程序和全局异常处理程序。如何调用这两个

Spring @Controller异常处理程序和全局异常处理程序。如何调用这两个
EN

Stack Overflow用户
提问于 2017-09-07 04:17:54
回答 1查看 1.1K关注 0票数 1

我有一个全局异常处理程序可以跨REST @Controller共享,为此,我使用@ControllerAdvice和一些@ExceptionHandler方法。这个很好用。现在,如果我在一个特定的Rest中添加了一个@ExceptionHandler,那么这个新的处理程序优先于全局异常处理程序,而全局处理程序永远不会被调用。

我需要的实际上是两个电话。命令不重要。关键是有一些全局的、与控制器无关的错误处理代码,还有一些特定于控制器的错误处理,我需要两者都执行。这个是可能的吗?例如,我是否可以在控制器特定的处理程序(首先称为)中将异常处理标记为未处理,以便调用行中的下一个处理程序?

我知道我可以将@ControllerAdvice注入到@Controller中,并自己从特定的处理程序中调用全局处理程序,但是我宁愿保持控制器与全局异常处理程序解耦。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-07 06:54:35

我不认为你可以用开箱即用的弹簧来做这件事。如果您在幕后查看此方法ExceptionHandlerExceptionResolver#doResolveHandlerMethodException,首先可以看到Spring寻找将处理发生的异常的单个方法:

代码语言:javascript
复制
    ...
    ServletInvocableHandlerMethod exceptionHandlerMethod = getExceptionHandlerMethod(handlerMethod, exception);
    if (exceptionHandlerMethod == null) {
        return null;
    }
    ...

您还可以查看getExceptionHandlerMethod方法的实现。首先,它试图在您的控制器方法中找到适当的处理程序,如果什么也找不到--然后在控制器顾问中。

在此之后,它调用它:

代码语言:javascript
复制
    try {
        if (logger.isDebugEnabled()) {
            logger.debug("Invoking @ExceptionHandler method: " + exceptionHandlerMethod);
        }
        exceptionHandlerMethod.invokeAndHandle(webRequest, mavContainer, exception, handlerMethod);
    }
    catch (Exception invocationEx) {
        if (logger.isErrorEnabled()) {
            logger.error("Failed to invoke @ExceptionHandler method: " + exceptionHandlerMethod, invocationEx);
        }
        return null;
    }

您还应该注意,Spring吞噬了在原始异常处理过程中可能发生的任何异常,因此您甚至不能从第一个处理程序中抛出新的异常,或者重新抛出原始异常,以便在其他地方捕获它(实际上可以,但这是没有意义的)。

因此,如果您真的想这样做--我想唯一的方法是编写您自己的ExceptionHandlerExceptionResolver (可能扩展Spring ExceptionHandlerExceptionResolver)并修改doResolveHandlerMethodException方法,因此它会查找乘exceptionHandlerMethod (控制器中的一个和顾问中的一个),并在一个链中调用它。这可能很棘手:)

另外,你也可以看看 Jira的票。

希望能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46087710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档