Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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 Spring@autowiredbean为空-如何找到错误_Java_Spring_Spring Mvc_Autowired - Fatal编程技术网

Java Spring@autowiredbean为空-如何找到错误

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

我将SpringBatch和石英计时器集成到我的SpringMVC应用程序中。目前我有几个目录:

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