Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法将服务自动连接到AsyncUncaughtExceptionHandler的实现中_Java_Spring_Asynchronous_Exception_Autowired - Fatal编程技术网

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

Java 无法将服务自动连接到AsyncUncaughtExceptionHandler的实现中,java,spring,asynchronous,exception,autowired,Java,Spring,Asynchronous,Exception,Autowired,我的弹簧自动接线有问题。我有一个实现AsyncUncaughtExceptionHandler的类 @Component public class MyExceptionHandler implements AsyncUncaughtExceptionHandler { @Autowired MyService myService; @Override public void handleUncaughtException(Throwable throwabl

我的弹簧自动接线有问题。我有一个实现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的问题,这些问题解决了类似的问题。这些问题是由代理机制引起的,但我没有设法使代码正常工作。此外,我不确定这是否是问题所在


感谢您的帮助。提前感谢。

您还需要将
MyExceptionHandler
标记为bean:

@Component
public class MyExceptionHandler implements AsyncUncaughtExceptionHandler {

在配置asyncExceptionHandler时,错误实际上在我这边

@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 {
            //...
        }
    }
必须改变这一点:

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

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

这里发生的是

  • 异步代码在一个单独的线程上运行(因此
    @ComponentScan
    请参阅并初始化新线程)
  • 默认情况下,所有bean都是单例的(有关更多详细信息,请参阅spring中的bean范围)。因为新线程在不同的容器中运行。它不会得到服务bean的引用,因此为空
  • 为什么
    @ComponentScan
    没有处理它? 组件扫描主要是扫描包的子集和 服务可以在不同的包中定义
  • 解决方案:
    使用
    @ApplicationScope
    注释创建服务bean应用程序范围。

    您的
    MyExceptionHandler
    a
    @service
    @组件
    或类似内容吗?是的,我忘了提到这一点。我已经更新了问题。在配置
    MyExceptionHandler
    的位置添加代码。我的猜测是您使用了
    newmyExceptionHandler()
    ,而不是使用Spring托管实例。我会更新这个问题@组件存在于MyExceptionHandler中