java NoSuchBeanDefinitionException:没有符合条件的bean,SpringBoot应用程序出错

ttisahbt  于 2023-05-12  发布在  Java
关注(0)|答案(1)|浏览(173)

SpringBoot应用程序(MainApplication)在ApplicationReadyEvent上,我尝试触发Quartz event,但我的服务类

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type error.

MainApplication.java

@EventListener(ApplicationReadyEvent.class)
public void doSomethingAfterStartup() {
    strtsch.startSchedular();
}

启动调度程序

@Component
public class StartupScheduler implements ApplicationListener<SpringApplicationEvent> {

    @Autowired
    private ApplicationContext context;

    public void startSchedular() {
        SchedulerJobService jobService = (SchedulerJobService) context.getBean(SchedulerJobService.class);
        // error org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'SchedulerJobService' available
        // at org.springframework.beans.factory.support.DefaultListableBean
    }
}

SchedulerJobService

@Transactional
@Component
@Scope(value="singleton")
public class SchedulerJobService implements InitializingBean {

    @Autowired
    private ApplicationContext context;

    @Override
    public void afterPropertiesSet() throws Exception {
        context.getBean("SchedulerJobService");
        System.out.println("ScheduleJobService is up");
    }
}

我想检查我哪里出错了/我错过了什么,这样我就可以访问我的服务bean,它有加载quartz schedule的方法。
上面的代码在我从eclipse运行时运行良好,但是,当我从eclipse创建Runnable Jar并从命令提示符运行它时,会出现上面的错误。
谢啦

anauzrmj

anauzrmj1#

请使用@EventListener(ApplicationReadyEvent.class)而不实现ApplicationEventListener接口,或者,更好的可读性和逻辑性,请从MainApplication中删除@EventListener并使StartupScheduler实现ApplicationEventListener<ApplicationReadyEvent>。你把事件配置搞得有点乱。要说清楚,因为现在你的应用程序中有2个事件监听器。
处理问题:
您注入的上下文没有SchedulerJobService bean。现在,您的应用中有***2个侦听器,并且每个侦听器都在ApplicationContext构造的不同阶段操作***,可能存在2个可能的问题。
1.例如,您试图从ContextStartedEvent上的上下文获取bean(这很容易实现,因为您的StartupScheduler侦听所有SpringApplicationEvent事件)。当此事件被触发时,spring刚刚开始上下文构造,它还没有StartupScheduler bean。你会得到这个错误。要检查是否是这种情况,请提供这3个类的完整代码。
1.可能是StartupScheduler bean只是在ComponentScan之外,而spring甚至现在这个bean已经存在。为了验证这不是,因为我不知道你的项目包结构,你可以用@Import(StartupScheduler)注解你的MainApplication(不要弄乱你当前的@ComponentScan)。通过这种方式,spring将把所需的bean带入上下文。

相关问题