【问题标题】:Spring controller exception handling locally and globally本地和全局的 Spring 控制器异常处理
【发布时间】:2020-01-18 09:58:59
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: spring exceptionhandler


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,我知道 AOP,但我从未真正使用过它。我确实研究过它,它似乎可以解决我的问题。然而有趣的是,在我发布这个(并阅读你的回复)的那天,我无法让它工作。我离开该项目三周,今天回来,现在它似乎工作了(虽然只是记录,但这意味着它正在工作)。
    【解决方案2】:

    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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-09-05
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 2016-11-18
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      相关资源
      最近更新 更多