Spring Batch:org.springframework.batch.item.ReaderNotOpenException:Reader 必须先打开才能读取

新手上路,请多包涵

我阅读了 SO 相关问题,但解决方案对我不起作用。

我得到 org.springframework.batch.item.ReaderNotOpenException: Reader must be open before it can be read 异常。

下面是我的配置:

 @Bean
@StepScope
public ItemReader<Player> reader(@Value("#{jobParameters[inputZipfile]}") String inputZipfile) {
                final String [] header = { .. this part omitted for brevity ... };
                FlatFileItemReader<Player> reader = new FlatFileItemReader<Player>();

                System.out.println("\t\t\t\t\t"+inputZipfile);

                reader.setResource(new ClassPathResource(inputZipfile));
                reader.setLineMapper(new DefaultLineMapper<Player>() {{
                    setLineTokenizer(new DelimitedLineTokenizer() {{
                        setNames( header );
                    }});
                    setFieldSetMapper(new BeanWrapperFieldSetMapper<Player>() {{
                        setTargetType(Player.class);
                    }});
                }});
                reader.setComments( header );
                return reader;
}

@Bean
@StepScope
public ItemProcessor<Player, PlayersStats> processor(@Value("#{jobParameters[statType]}") String statType,
                                                                 @Value("#{jobParameters[season]}") String season){
                PlayersStatsProcessor psp = new PlayersStatsProcessor();
                psp.setStatisticType( StatisticType.valueOf(statType) );
                psp.setSeason( season );
                return psp;
}

@Bean
@StepScope
public ItemWriter<PlayersStats> writer(){
            return new CustomWriter();
}

@Bean
public Job generateStatisticsJob() {

        return this.jobs.get("generateStatisticsJob")
                .incrementer(new RunIdIncrementer())
                .start(processPlayerStats())
                //.end()
                .build();
}

@Bean
public Step processPlayerStats() {
           return this.steps.get("processPlayerStats")
                        .<Player, PlayersStats> chunk(10)
                        .reader(reader(null))
                        .processor(processor(null,null))
                        .writer(writer())
                        .build();
}

inputZipFile 变量设置正确并且文件存在于驱动器上。我检查了 FlatFileItemReader 代码,当未设置阅读器类的阅读器成员时,会发生 ReaderNotOpenException。 reader 成员在 doOpen 方法中设置。看起来没有调用 doOpen。问题是为什么?

原文由 Luke 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 741
1 个回答

当我将阅读器 bean 的返回类型从 Item 更改为 FlatFileItemReader 时,问题就消失了。我仍然不清楚为什么这是一个问题,因为 chunk().reader() 接受 ItemReader 作为输入。我假设在引擎盖下有一些 AOP 魔法,它执行 FlatFileReader 初始化并按返回类型进行匹配。

原文由 Luke 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题