Java Spring@autowiredbean为空-如何找到错误
我将SpringBatch和石英计时器集成到我的SpringMVC应用程序中。目前我有几个目录:Java Spring@autowiredbean为空-如何找到错误,java,spring,spring-mvc,autowired,Java,Spring,Spring Mvc,Autowired,我将SpringBatch和石英计时器集成到我的SpringMVC应用程序中。目前我有几个目录: @Autowire除了在MyBatchJob.java(->代码可以编译,但在运行时属性为空)中,其他地方都可以使用 BatchConfig带有以下注释: @Configuration @ComponentScan(basePackages = "my.backend.schedule") @EnableBatchProcessing // imports jobLauncher, stepBuil
@Autowire
除了在MyBatchJob.java(->代码可以编译,但在运行时属性为空)中,其他地方都可以使用
BatchConfig带有以下注释:
@Configuration
@ComponentScan(basePackages = "my.backend.schedule")
@EnableBatchProcessing // imports jobLauncher, stepBuilderFactory, jobBuilderFactory, ...
public class BatchConfig {
@Bean
public JobDetail jobDetail() {
return newJob(MyBatchJob.class)
.withIdentity("name", "group")
.build();
}
并使用@Import(BatchConfig.class)
在MainConfig中导入。在这个配置文件和控制器中,我可以@Autowire
我需要的类。但它在my.backend.schedule.MyBatchJob类中不起作用:
@Component
public class MyBatchJob implements org.quartz.Job {
@Autowired
JobLauncher jobLauncher; // null
@Autowired
StepBuilderFactory stepBuilderFactory; // null
@Autowired
JobBuilderFactory jobBuilderFactory; // null
原因是什么?我如何找到并修复它
梅塔:我已经搜索了很多,在这里看到了很多线索,但是没有找到解决方案。我已经知道春豆是如何生活在容器里的,但这并没有给我答案——我可能忽略了一些事情
编辑:根据请求将附加信息插入上述BatchConfig类中
edit2:更改为JobDetailFactoryBean:
BatchConfig:
@Bean
public JobDetailFactoryBean jobDetailFactory() {
JobDetailFactoryBean factory = new JobDetailFactoryBean();
factory.setJobClass(MyBatchJob.class);
return factory;
}
@Bean
public Trigger myJobTrigger() throws Exception {
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
Trigger trigger = newTrigger()
.withIdentity("mySynchTrigger", "synch")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(30) // testing
.repeatForever())
.build();
scheduler.scheduleJob(jobDetailFactory().getObject(), trigger);
return trigger;
}
您应该按照描述注册,而不是自己使用Quartz API。如何检索和使用
MyBatchJob
bean?在BatchConfig中,我使用JobBuilder.newJob
创建JobDetail
-bean。这可能是问题所在吗?请告诉我们。编辑你的问题。是的。您应该始终对所有bean使用@Autowired。新操作员将导致问题自动连线JobDetailFactoryBean
创建MyBatchJob
的新实例。它不使用SpringBean。为什么不直接使用@Scheduled
而不是这个相当复杂的设置呢?我像上面的问题一样更改了BatchConfig(使用JobDetailFactoryBean),jobLauncher仍然保持为空。可能文档已经过时了,因为它仍然只是xml?
@Bean
public JobDetailFactoryBean jobDetailFactory() {
JobDetailFactoryBean factory = new JobDetailFactoryBean();
factory.setJobClass(MyBatchJob.class);
return factory;
}
@Bean
public Trigger myJobTrigger() throws Exception {
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
Trigger trigger = newTrigger()
.withIdentity("mySynchTrigger", "synch")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(30) // testing
.repeatForever())
.build();
scheduler.scheduleJob(jobDetailFactory().getObject(), trigger);
return trigger;
}