java - 我在哪里可以在 Spring 捕获非休息 Controller 异常?

标签 java spring spring-mvc exception

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

@ControllerAdvise
public class ExceptionHandlerController {   

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

但我认为我只会在调用 Controller 方法后捕获异常。

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

最佳答案

But how to catch exceptions generated outside the rest context? For example lifecycle callbacks or scheduled tasks

我能想到的一个解决方案是使用 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 , 也。也不要忘记启用自动代理,使用 @EnableAspectJAutoProxy在 Java 配置或 <aop:aspectj-autoproxy/>在 XML 配置中。

关于java - 我在哪里可以在 Spring 捕获非休息 Controller 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37164855/

相关文章:

java - Spring/Thymeleaf : Property or field cannot be found on null, 但仍在渲染

java - 多对多关系中的Hibernate无限循环递归

java - @TestConfiguration 在顶级类上的目的是什么?

java - Xmx 是 3072m 但 Runtime.getRuntime().totalMemory() 返回 59mb

java - C# 中的代理服务器

使用 Spring Boot 时未初始化 java.lang.IllegalStateException LifecycleProcessor 和 ApplicationEventMulticaster

java - 如何在 mvcmock 单元测试中注入(inject)身份验证

java - Spring ToStringCreator 的使用

java - 如何在 javascript 中启动 Spring WebFlow 转换

java - 实现自定义 Spring Security 身份验证方法