0

我想就如何实现以下目标提出一些建议。我没有提供代码,因为我的问题是理论上的,但我可以根据要求提供。所以情况是这样的:

  • 我有多个控制器,每个都可以抛出 XYException
  • 我有一个@ControllerAdvice 类,其中有一个@ExceptionHandler 监视XYExceptions。当它发生时,它会打印出“XY”。
  • 在一个(也是唯一一个)控制器中,当 XYException 被抛出时,我想做一些额外的任务(比如说,做一些只有那个控制器才能做的事情),然后我希望将异常“传递”到全局上面提到的处理程序。

我知道我可以捕获异常,在 catch 块中执行所需的任务,然后重新抛出异常,以便全局处理程序可以捕获它,但是如果控制器中有 23 个方法可能会抛出 XYExceptions,我不想将 try-catch 块放入所有 23 种方法中。

实现这一目标的干净 Spring 方法是什么?

4

2 回答 2

1

你可以AOP用来实现这一点。您将编写一个拦截该控制器内的方法的方法,当它们抛出异常时,您的aop方法将运行并且您可以执行您的操作,然后异常将进入您的处理程序类。

为了实现这一点,你应该有一个类并用它来注释@Aspect@Component 然后用一个方法注释@AfterThrowing并设置切入点,当给定方法抛出异常时,切入点将被拦截。

查看面向方面的编程和Aspectj更多信息。

于 2019-09-17T14:04:56.473 回答
0

处理这种情况的简单方法ControllerAdvice是检查异常起源的堆栈跟踪。

@ExceptionHandler(Exception.class)
public String handleExc(HttpServletRequest req, HttpServletResponse res, Exception e) {
    if ( /*Have all null and safe check */ e.getStackTrace()[0].contains("MyController")) {
        // Do your exception handling
    }
}
于 2019-09-17T14:53:21.890 回答