0

这是我的代码,我不知道为什么我的 beanMouvementToMapItemProcessor 没有被注入,它在构造函数中总是 null

@Autowired
    private MouvementToMapItemProcessor mvts;

    private Iterator it;

    public InMemoryMouvementReader() {
        it = mvts.getMouvmentFileRowMap().entrySet().iterator();
    }

这是我的配置类:

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {


    public BatchConfiguration() {
    }


    @Bean
    public ItemReader<MouvementFileRow> mouvementMapReader() {
        return new InMemoryMouvementReader();
    }


    @Bean
    public ItemProcessor<MouvementFileRow, MouvementFileRow> mouvementMapProcessor() {
        return new MouvementToMapItemProcessor();
    }



    @Bean
    public Step generateDemmandeCommunication() {
        return stepBuilderFactory.get("generateDemmandeCommunication")
                .<MouvementFileRow, DemandeCommunication>chunk(10)
                .faultTolerant().skipLimit(Integer.MAX_VALUE).skip(CustomReaderSkipException.class)
                .reader(mouvementMapReader())
                .processor(mouvementProcessor())
                .writer(demandeCommunicationItemWriter())
                .listener(customStepListener())
                .build();
    }


public class InMemoryMouvementReader implements ItemReader<MouvementFileRow> {

    @Autowired
    private MouvementToMapItemProcessor mvts;

    private Iterator it;

    public InMemoryMouvementReader() {
        it = mvts.getMouvmentFileRowMap().entrySet().iterator();
    }

    private void initialize() {
    }

    @Override
    public MouvementFileRow read() throws Exception {
        if (it.hasNext()) {
            return mvts.getMouvmentFileRowMap().get(it.next());
        } else return null;
    }
}


@Component
public class MouvementToMapItemProcessor implements ItemProcessor<MouvementFileRow, MouvementFileRow> {

    private static final Logger log = LoggerFactory.getLogger(MouvementToMapItemProcessor.class);

    private Map<Long, MouvementFileRow> mouvmentFileRowMap;

    public MouvementToMapItemProcessor() {
        mouvmentFileRowMap = new HashMap<Long, MouvementFileRow>();

    }

    @Override
    public MouvementFileRow process(final MouvementFileRow mouvement) throws Exception {
        ........
        return null;
    }

    public Map<Long, MouvementFileRow> getMouvmentFileRowMap() {
        return mouvmentFileRowMap;
    }

我的堆栈跟踪

启动 ApplicationContext 时出错。要显示自动配置报告,请在启用“调试”的情况下重新运行您的应用程序。11:55:29.139 [restartedMain] 错误 osboot.SpringApplication - 应用程序启动失败 org.springframework.beans.factory.BeanCreationException:在类路径资源 [fr/gouv/justice/spark/fileToBaseBatch/ 中定义名称为“mouvementMapReader”的 bean 创建错误BatchConfiguration.class]:通过工厂方法实例化 Bean 失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [org.springframework.batch.item.ItemReader]:工厂方法“mouvementMapReader”抛出异常;嵌套异常是 org.springframework.beans.factory.support.ConstructorResolver 中的 java.lang.NullPointerException。org.springframework.beans.BeanInstantiationException:无法实例化[org.springframework.batch.item.ItemReader]:工厂方法'mouvementMapReader'抛出异常;嵌套异常是 org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) 的 org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) 的 java.lang.NullPointerException ...省略了 22 个常见帧 原因:java.lang.NullPointerException: null at fr.gouv.justice.spark.fileToBaseBatch.readers.InMemoryMouvementReader.(InMemoryMouvementReader.java:19) at fr.gouv.justice.spark.fileToBaseBatch。 BatchConfiguration.mouvementMapReader(BatchConfiguration.java:74) 在 fr.gouv.justice。

4

1 回答 1

0

你直到它被构造之后才会被MouvementToMapItemProcessor注入InMemoryMouvementReader,这就是导致构造函数失败并出现 NullPointerException 的原因。改用构造函数注入:

@Autowired
public InMemoryMouvementReader(MouvementToMapItemProcessor mvts) {
    this.mvts = mvts;
    it = mvts.getMouvmentFileRowMap().entrySet().iterator();
}

@Bean
public ItemReader<MouvementFileRow> mouvementMapReader(MouvementToMapItemProcessor mvts) {
    return new InMemoryMouvementReader(mvts);
}

@Bean
public Step generateDemmandeCommunication(InMemoryMouvementReader reader, MouvementToMapItemProcessor mvts) {
    return stepBuilderFactory.get("generateDemmandeCommunication")
            .<MouvementFileRow, DemandeCommunication>chunk(10)
            .faultTolerant().skipLimit(Integer.MAX_VALUE).skip(CustomReaderSkipException.class)
            .reader(reader)
            .processor(mvts)
            .writer(demandeCommunicationItemWriter())
            .listener(customStepListener())
            .build();
}
于 2017-12-30T13:16:07.327 回答