How to ignore default exception handling advice when it is already handled by another advice(如何在默认异常处理建议已由其他建议处理时将其忽略)
问题描述
我目前有一个ExceptionAdvice类,它处理所有基本的(400、405、404和其他)异常。例如,我有一个默认建议,它处理所有的MethodArgumentNotValidExceptions并返回400个错误请求错误。例如
我还有一个不同的切入点建议,目标是处理方法ArgumentNotValidException的一个控制器方法,因为我需要为这种情况创建自定义错误消息。大概是这样的
问题是,控制器建议首先被调用,但随后它被默认的建议覆盖,因此我得到了默认的错误消息。
有没有办法在其他建议已经处理过的情况下忽略来自默认建议的@ExceptionHandler
,这样我就可以拿回CustomError消息?
推荐答案
您误会了@AfterThrowing
:
您只能使用这种建议,以便在方法因异常退出之后、抛出它之前以及可能由另一段代码处理之前执行某些操作。您无法更改应用程序流,例如,捕获异常或操作方法结果。
此外,由于我刚才解释的原因,
@AfterThrowing
建议必须返回void
。您的建议甚至不应该编译,但是编译器应该会产生错误";。这个建议必须返回void";。至少这是我的AspectJ编译器所做的(我使用的是完整的AspectJ,而不是称为Spring AOP的精简版,但结果应该是相同的。)有关
@AfterThrowing
的详细信息,请参阅Spring AOP manual。
解释完这一点后,您能做什么?我将在一个纯Java+AspectJ示例中向您展示,以便将Spring从等式中去掉。您可以自己轻松地将知识传授给Spring AOP和Spring MVC错误处理程序:
更改应用程序流所需的是@Around
建议。如果您发出这种通知,捕获特殊方法中的错误并返回错误对象,则默认的Spring异常处理程序甚至不会看到存在异常,因为它已经被方面捕获。即,默认处理程序将仅处理方面未处理的所有其他错误。
以下是一些完全自洽且可编译的示例代码:
响应类:
我们在示例应用程序中使用它们,以便像在Spring中一样模拟正常和错误响应。
驱动程序应用程序:
该应用程序有两种方法,这两种方法都会随机生成正常或错误响应。方法produceSpecialException()
是我们希望由方面稍后处理的方法。
我们通过try-Catch块模拟默认处理程序,然后调用帮助器方法defaultHandler(Exception e)
。
无方面控制台日志:
正如您在上面看到的,所有错误都由默认处理程序处理。这并不令人惊讶。方面:
该方面仅处理";特殊";错误,忽略其他错误。
带有方面的控制台日志:
如上所述,现在某些错误由aspect handler
(";特殊错误&)处理,而所有其他错误仍由default handler
(";正常错误&q;)处理。
这篇关于如何在默认异常处理建议已由其他建议处理时将其忽略的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!