Spring Batch:org.springframework.batch.item.ReaderNotOpenException:Reader必须先打开才能读取 [英] Spring Batch: org.springframework.batch.item.ReaderNotOpenException: Reader must be open before it can be read

查看:309
本文介绍了Spring Batch:org.springframework.batch.item.ReaderNotOpenException:Reader必须先打开才能读取的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I read SO related questions but the solutions don't work for me.

我得到 org.springframework.batch.item。 ReaderNotOpenException:Reader必须先打开才能读取 exception。

I get the org.springframework.batch.item.ReaderNotOpenException: Reader must be open before it can be read exception.

以下是我的配置:

@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代码,并且当未设置reader类的reader成员时发生ReaderNotOpenException。读者成员在doOpen方法中设置。
看起来没有调用doOpen。问题是为什么?

The inputZipFile variable is set properly and the file exists on the drive. I checked in the FlatFileItemReader code and the ReaderNotOpenException occurs when the reader member of the reader class is not set. The reader member is set in doOpen method. It looks that doOpen is not called. The question is why ?

推荐答案

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

The issue disappeared when I change the return type of my reader bean from Item to FlatFileItemReader. It is still not clear to me why this is a problem since chunk().reader() accepts ItemReader as an input. I assume that there is some AOP magic under the hood which does FlatFileReader init and matches by the return type.

这篇关于Spring Batch:org.springframework.batch.item.ReaderNotOpenException:Reader必须先打开才能读取的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆