繁体   English   中英

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

[英]Configuring openCSV instead of FlatFileItemReader in spring batch step

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

正如此处链接的帖子中所建议的如何在 spring 批处理中将 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();
        }

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

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

您需要基于 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 来读取文件和 map 数据到对象。 您不需要读取部分,因为这将由 Spring Batch 中的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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM