ItemReader返回一个包含整行作为字符串的FlatFileItemReader

时间:2014-02-20 16:47:37

标签: java spring parsing spring-batch

使用Spring Batch我试图将输入文件的每一行都作为String提供给ItemProcessor而不在ItemReader中进行任何“CSV解析”。

我推出了一个配置Java类(使用@Configuration@EnableBatchProcessing),其中包含以下reader()方法,该方法使下一个ItemProcessor抛出{{1}但是。

ClassCastException应读取输入文件并以ItemReader的形式传递到输入文件的每一行ItemProcessor

String

运行上一段代码时,@Bean public ItemReader<String> reader() { FlatFileItemReader<String> reader = new FlatFileItemReader<>(); reader.setResource(new ClassPathResource("data-to-process.txt")); reader.setLineMapper(new DefaultLineMapper() {{ setLineTokenizer(new DelimitedLineTokenizer()); setFieldSetMapper(new PassThroughFieldSetMapper()); }}); return reader; } 中的ItemProcessor期待String reader(),我会收到例外情况:

    java.lang.ClassCastException: org.springframework.batch.item.file.transform.DefaultFieldSet cannot be cast to java.lang.String

我写的自定义ItemProcessor定义为:

    public class MyOwnCustomItemProcessor implements ItemProcessor<String, MyOwnCustomBusinessBean> {

我相信我应该在PassThroughFieldSetMapper中使用此ItemReader,我不想使用任何类型的标记器。根据文档,我认为我必须使用它,我无法避免它,但我一直在抛出异常。

如何将每个输入行直接“转移”为StringItemProcessor,例如{{1}}。 ?

2 个答案:

答案 0 :(得分:6)

如果可用,请使用PassThroughLineMapper

public class PassThroughLineMapper implements LineMapper<String> {
  @Override
  public String mapLine(String line, int lineNumber) throws Exception {
    return line;
  }
}

答案 1 :(得分:0)

我还添加了一个同时找到的解决方法(使用FieldSet作为ItemReaderItemProcessor的输入参数),即使@bellabax提供了更好的解决方案。

检查我如何使用FieldSet类型的对象。

ItemReader

@Bean
public ItemReader<FieldSet> reader() {

    FlatFileItemReader<FieldSet> reader = new FlatFileItemReader<>();
    reader.setResource(new ClassPathResource("data-to-process.txt"));
    reader.setLineMapper(new DefaultLineMapper() {{
        setLineTokenizer(new DelimitedLineTokenizer());
        setFieldSetMapper(new PassThroughFieldSetMapper() {{

        }});

    }});
    return reader;
}

Spring Batch Configuration类中的ItemProcessor

@Bean
public ItemProcessor<FieldSet, MyOwnCustomBusinessBean> processor() {

    return new MyOwnCustomItemProcessor();
}

ItemProcessor

public class MyOwnCustomItemProcessor implements ItemProcessor<FieldSet, MyOwnCustomBusinessBean> {

    @Override
    public MyOwnCustomBusinessBean process(FieldSet originalInputLineFromInputFile) throws Exception {

        String originalInputLine = originalInputLineFromInputFile.getValues()[0];

        [...]