在 spring 批处理步骤中配置 openCSV 而不是 FlatFileItemReader

Configuring openCSV instead of FlatFileItemReader in spring batch step

我正在尝试在 spring 批处理的 reader() 步骤中配置 openCSV,以直接将从 CSV 文件读取的记录转换为 JAVA POJO。但是我 运行 正在研究如何使用 openCSV 正确设置 lineMapper 的问题。

按照此处链接 post 中的建议 How to replace flatFileItemReader with openCSV in spring batch,我尝试如下:

public Event reader() throws IOException {
        FlatFileItemReader<Event> itemReader = new FlatFileItemReader<Event>();
        itemReader.setLineMapper(lineMapper());
        itemReader.setLinesToSkip(1);
        itemReader.setResource(new FileSystemResource(inputFilePath));
        return itemReader;
    }

但我不知道如何配置 lineMapper:

    public LineMapper<Event> lineMapper() throws IOException {
       DefaultLineMapper<Event> lineMapper = new DefaultLineMapper<Event>();
       DelimitedLineTokenizer lineTokenizer = new DelimitedLineTokenizer("\t");
       BeanWrapperFieldSetMapper<Event> fieldSetMapper = new BeanWrapperFieldSetMapper<Event>();
       fieldSetMapper.setTargetType(Event.class);
       lineMapper.setLineTokenizer(???);
       lineMapper.setFieldSetMapper(???);

我有读取文件并将其转换为所需 POJO 的代码但是放在哪里:

        try (
                Reader reader = Files.newBufferedReader(Paths.get(inputFilePath));
        ) {
            CsvToBean<Event> csvToBean = new CsvToBeanBuilder(reader)
                    .withSkipLines(1)
                    .withType(Event.class)
                    .withIgnoreLeadingWhiteSpace(true)
                    .build();
            return csvToBean.iterator().next();
        }

非常感谢任何帮助我指明正确方向的人。

您正在使用 DefaultLineMapper 并试图在其中设置 LineTokenizerFieldSetMapper,但这不是您分享的 link 中提到的内容。

您需要基于 OpenCSV 的 LineMapper 接口的自定义实现:

public class OpenCSVLineMapper<T> implements LineMapper<T> {
    
    @Override
    public T mapLine(String line, int lineNumber) throws Exception {
        // TODO use OpenCSV to map a line to a POJO of type T
        return null;
    }
}

OpenCSV 提供 API 来读取文件和将数据映射到对象。您不需要读取部分,因为这将由 Spring 批处理中的 FlatFileItemReader 完成,您只需要将 OpenCSV 用于映射部分。

完成后,您可以在 FlatFileItemReader:

上设置基于 OpenCSV 的线映射器实现
public FlatFileItemReader<Event> reader() throws IOException {
   FlatFileItemReader<Event> itemReader = new FlatFileItemReader<Event>();
   itemReader.setResource(new FileSystemResource(inputFilePath));
   itemReader.setLinesToSkip(1);
   itemReader.setLineMapper(new OpenCSVLineMapper<>());
   return itemReader;
}