Spring批量在类读取器中定义FlatFileItemReader,它实现了不在bean java conf

时间:2017-05-08 18:31:37

标签: java spring spring-batch

我有一个步骤,我定义了读者,处理器和作家。

我想为每个人定义他自己的类,让读者从CSV文件中获取数据:

public class Reader implements ItemReader<FlatFileItemReader<PersonneDTO>>, StepExecutionListener{  

    private String file;

    @Override
    public void beforeStep(StepExecution stepExecution) {
        file = (String) stepExecution.getJobExecution().getExecutionContext().get("personneFile");  
    }

    @Override
    public FlatFileItemReader<PersonneDTO> read()
            throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
         FlatFileItemReader<PersonneDTO> reader = new FlatFileItemReader<PersonneDTO>();
            reader.setResource(new FileSystemResource(file));
            reader.setLineMapper(new DefaultLineMapper<PersonneDTO>() {{
                setLineTokenizer(new DelimitedLineTokenizer() {{
                    setNames(new String[] {"nom", "prenom" ,"dateNaissance" });
                }});
                setFieldSetMapper(new BeanWrapperFieldSetMapper<PersonneDTO>() {{
                    setTargetType(PersonneDTO.class);
                }});
            }});
            return reader;
    }

    @Override
    public ExitStatus afterStep(StepExecution stepExecution) {
        return null;
    }
}

在配置java中我有

 @Bean
public Step stepTraitementFile() {
    return stepBuilderFactory.get("step1")
            .<PersonneDTO, Personne> chunk(1)
            .reader(reader())
            .processor(processor())
            .writer(writer())
            .build();
}
@Bean
public Reader reader() {
    return new Reader();
}

配置java中有一个错误告诉:

  

类型中的方法读取器(ItemReader)   SimpleStepBuilder不适用于   争论(读者)。

我在网上看到的所有示例都在配置类中设置了阅读器,请帮助!

1 个答案:

答案 0 :(得分:0)

我不确定您的文件名是如何生成的,但也许您可以使用late binding来解决您的问题。后期绑定允许您在所需信息可用时稍后实例化Spring Batch bean。要使用后期绑定,请使用“常规”FlatFileItemReader但使用“步骤”范围。类似的东西:

@Bean
@StepScope
public FlatFileItemReader<PersonneDTO> reader(@Value("#{jobExecutionContext['personneFile']}") String pathToDFile) {
     FlatFileItemReader<PersonneDTO> reader = new FlatFileItemReader<PersonneDTO>();
     reader.setResource(new FileSystemResource(pathToDFile));
     reader.setLineMapper(new DefaultLineMapper<PersonneDTO>() {{
        setLineTokenizer(new DelimitedLineTokenizer() {{
            setNames(new String[] {"nom", "prenom" ,"dateNaissance" });
        }});
        setFieldSetMapper(new BeanWrapperFieldSetMapper<PersonneDTO>() {{
            setTargetType(PersonneDTO.class);
        }});
    }});
    return reader;
  }