0

我正在尝试在 spring 批处理的 reader() 步骤中配置 openCSV,以直接将从 CSV 文件读取的记录转换为 JAVA POJO。但我遇到了如何正确设置lineMapperopenCSV 的问题。

正如此处链接的帖子中所建议的,如何在春季批处理中将 flatFileItemReader 替换为 openCSV,我正在尝试如下:

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();
        }

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

4

1 回答 1

0

您正在使用DefaultLineMapperand 尝试在其中设置 a LineTokenizerFieldSetMapper但这不是您共享的链接中提到的内容。

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

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 来读取文件并将数据映射到对象。您不需要读取部分,因为这将由FlatFileItemReaderSpring Batch 完成,您只需将 OpenCSV 用于映射部分。

完成后,您可以在以下位置设置基于 OpenCSV 的线映射器实现FlatFileItemReader

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;
}
于 2021-03-18T09:33:48.853 回答