2016-05-11 35 views
2

我有春天mvc应用程序。为了捕获异常,我使用@ExceptionHandler注释。在哪里可以在春季捕获非休息控制器异常?

@ControllerAdvise 
public class ExceptionHandlerController { 

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

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

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

回答

0

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

一个解决方案,我能想到的它,是使用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/>