【问题标题】: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 配置中使用 <aop:aspectj-autoproxy/>。