有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我的弹簧自动接线有问题。我有一个实现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时抛出null指针。MyService在其他地方自动连接,没有任何问题,只有AsyncUncaughtExceptionHandler实现中的自动连接似乎会导致问题

@Service
public class MyService {

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

我已经讨论了一些有关StackOverflow的问题,这些问题解决了类似的问题。这些问题是由代理机制引起的,但我没有设法使代码正常工作。此外,我不确定这是否是问题所在

感谢您的帮助。提前谢谢


共 (3) 个答案

  1. # 1 楼答案

    您还需要将MyExceptionHandler标记为bean:

    @Component
    public class MyExceptionHandler implements AsyncUncaughtExceptionHandler {
    
  2. # 2 楼答案

    这里发生的是

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

    解决方案: 使用@ApplicationScope注释创建服务bean应用程序范围

  3. # 3 楼答案

    实际上,在配置asyncExceptionHandler时,我犯了一个错误

    必须改变这一点:

    @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;
        }
    }
    

    新手犯了个错误,但我很长时间都找不到