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并从命令提示符运行它时,会出现上面的错误。
谢啦
1条答案
按热度按时间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带入上下文。