在春天哪里可以捕获非休息控制器异常?

时间:2016-05-11 13:55:47

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

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

@ControllerAdvise
public class ExceptionHandlerController {   

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

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

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

1 个答案:

答案 0 :(得分:1)

  

但是如何捕获在其余上下文之外生成的异常?对于   示例生命周期回调或计划任务

我能想到的一个解决方案是使用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配置中使用<aop:aspectj-autoproxy/>来启用自动调整。