无法将服务自动连接到AsyncUncaughtExceptionHandler的实现中

时间:2018-08-01 11:01:49

标签: java spring asynchronous exception autowired

我对弹簧自动接线有问题。我有一个实现AsyncUncaughtExceptionHandler的类。

@Component
public class MyExceptionHandler implements AsyncUncaughtExceptionHandler {

    @Autowired
    MyService myService;

    @Override
    public void handleUncaughtException(Throwable throwable, Method method, Object... obj) {
        if (throwable instanceof MyException) {
            myService.handleException((MyException) throwable);
        } else {
            //...
        }
    }

当代码运行到调用myService的位置时,由于myService为null,将引发Nullpointer。 MyService在其他地方自动接线没有任何问题,只有在AsyncUncaughtExceptionHandler的实现中自动接线才会引起问题。

@Service
public class MyService {

    public void handleException(MyException e) {
        //...
    }
}

我在StackOverflow上遇到了一些问题,该问题解决了类似的问题。这些问题是由代理机制引起的,但是我没有设法使代码正常工作。另外,我不确定这是否是问题所在。

感谢您的帮助。预先感谢。

3 个答案:

答案 0 :(得分:0)

您还需要将MyExceptionHandler标记为bean:

@Component
public class MyExceptionHandler implements AsyncUncaughtExceptionHandler {

答案 1 :(得分:0)

在配置asyncExceptionHandler时,Mistake实际上在我这一边。

必须对此进行更改:

@Configuration
@EnableAsync
@ComponentScan
public class AsyncConfiguration implements AsyncConfigurer {

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return new RccAsyncExceptionHandler();
    }
}

对此:

@Configuration
@EnableAsync
@ComponentScan
public class AsyncConfiguration implements AsyncConfigurer {

    @Autowired
    MyExceptionHandler rccAsyncExceptionHandler;

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return rccAsyncExceptionHandler;
    }
}

菜鸟的错误,但我很长一段时间都找不到。

答案 2 :(得分:0)

这里发生的事情是,

  1. 异步代码在单独的线程上运行(因此 @ComponentScan 到 查看并初始化新线程)。
  2. 默认情况下,所有 bean 都是单例的(有关更多详细信息,请参阅 spring 中的 bean 范围)。由于新线程在不同的容器中运行。它不会获得服务 bean 的引用,因此为 null。
  3. 为什么@ComponentScan没有处理它? 组件扫描主要是扫描包的子集和 服务可以在不同的包中定义。

解决办法: 使用 @ApplicationScope 注释创建服务 bean 应用范围。