【问题标题】:Where can I catch non rest controller exceptions in spring?我在哪里可以在春季捕获非休息控制器异常?
【发布时间】:2016-09-06 23:39:28
【问题描述】:

我有 spring mvc 应用程序。为了捕获异常,我使用 @ExceptionHandler 注释。

@ControllerAdvise
public class ExceptionHandlerController {   

    @ExceptionHandler(CustomGenericException.class)
    public ModelAndView handleCustomException(CustomGenericException ex) {
            ....
    }
}

但我认为我只会在控制器方法调用之后捕获异常。

但是如何捕获在 rest 上下文之外产生的异常呢?例如生命周期回调或计划任务。

【问题讨论】:

    标签: java spring spring-mvc exception exception-handling


    【解决方案1】:

    但是如何捕获在 rest 上下文之外产生的异常呢?为了 生命周期回调或计划任务示例

    我能想到的一个解决方案是使用After Throwing Advice。基本思想是定义一个通知,该通知将捕获某些 bean 抛出的异常并适当地处理它们。

    例如,您可以定义一个自定义注释,如:

    @Target({ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Handled {}
    

    并使用该注释来标记应建议的方法。然后你可以用这个注释来注释你的工作:

    @Component
    public class SomeJob {
        @Handled
        @Scheduled(fixedRate = 5000)
        public void doSomething() {
            if (Math.random() < 0.5)
                throw new RuntimeException();
    
            System.out.println("I escaped!");
        }
    }
    

    最后定义一个通知来处理由@Handled注解的方法抛出的异常:

    @Aspect
    @Component
    public class ExceptionHandlerAspect {
        @Pointcut("@annotation(com.so.Handled)")
        public void handledMethods() {}
    
        @AfterThrowing(pointcut = "handledMethods()", throwing = "ex")
        public void handleTheException(Exception ex) {
            // Do something useful
            ex.printStackTrace();
        }
    }
    

    要对方法执行进行更精细的控制,您也可以使用Around Advice。另外不要忘记启用自动代理,在 Java 配置中使用 @EnableAspectJAutoProxy 或在 XML 配置中使用 &lt;aop:aspectj-autoproxy/&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 2012-02-19
      相关资源
      最近更新 更多