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



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

我提出了一个配置 Java 类(使用 @Configuration@EnableBatchProcessing),其中包含以下reader()方法,该方法正在使下一个ItemProcessor抛出ClassCastException

ItemReader应读取输入文件,并将输入文件的每一行作为String传递给ItemProcessor

@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中遇到异常,该异常期望来自reader()String

    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> {

我相信我应该在ItemReader中使用这个PassThroughFieldSetMapper,我不想使用任何类型的标记器。根据文档,我认为我必须使用它,我无法避免它,但我不断收到异常。

如何将每个输入行作为String直接"传输"到ItemProcessor,例如?

如果可用,请使用 PassThroughLineMapper

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

我还同时添加了我发现的解决方法(使用 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 批处理配置类中的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];
        [...]

最新更新