我有一个全局异常处理程序可以跨REST @Controller共享,为此,我使用@ControllerAdvice和一些@ExceptionHandler方法。这个很好用。现在,如果我在一个特定的Rest中添加了一个@ExceptionHandler,那么这个新的处理程序优先于全局异常处理程序,而全局处理程序永远不会被调用。
我需要的实际上是两个电话。命令不重要。关键是有一些全局的、与控制器无关的错误处理代码,还有一些特定于控制器的错误处理,我需要两者都执行。这个是可能的吗?例如,我是否可以在控制器特定的处理程序(首先称为)中将异常处理标记为未处理,以便调用行中的下一个处理程序?
我知道我可以将@ControllerAdvice注入到@Controller中,并自己从特定的处理程序中调用全局处理程序,但是我宁愿保持控制器与全局异常处理程序解耦。
发布于 2017-09-07 06:54:35
我不认为你可以用开箱即用的弹簧来做这件事。如果您在幕后查看此方法ExceptionHandlerExceptionResolver#doResolveHandlerMethodException,首先可以看到Spring寻找将处理发生的异常的单个方法:
...
ServletInvocableHandlerMethod exceptionHandlerMethod = getExceptionHandlerMethod(handlerMethod, exception);
if (exceptionHandlerMethod == null) {
return null;
}
...您还可以查看getExceptionHandlerMethod方法的实现。首先,它试图在您的控制器方法中找到适当的处理程序,如果什么也找不到--然后在控制器顾问中。
在此之后,它调用它:
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的票。
希望能帮上忙。
https://stackoverflow.com/questions/46087710
复制相似问题