【问题标题】:Configuring openCSV instead of FlatFileItemReader in spring batch step在春季批处理步骤中配置 openCSV 而不是 FlatFileItemReader
【发布时间】:2021-06-15 03:58:11
【问题描述】:

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

正如链接在这里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();
        }

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

【问题讨论】:

    标签: java spring-boot spring-batch opencsv csvtojson


    【解决方案1】:

    您正在使用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 来读取文件并将数据映射到对象。您不需要读取部分,因为这将由 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;
    }
    

    【讨论】:

    • 首先,感谢您在这个问题上指导我 @mahmoud-ben-hassine。但我发现,我们使用 openCSV 通过 CsvToBean 将输入文件直接映射到 POJO。所以,我不确定如何将一条线映射到对象 T?
    • 如果我最终编写了类似这样的代码:Event event = new Event(); event.setSomething(line[0]); event.setSomeOtherThing(line[1]); ..... ,那么它带来了 openCSV 的有用性,因为它被引入以避免首先执行上述操作。因为上面不用openCSV就可以实现。
    • 这取决于你。 OpenCSV 进行读取和映射。您在 Spring Batch 应用程序中使用 OpenCSV 只需要映射部分。如果这不是您想要的,那么我确实看不到使用 OpenCSV 的附加值。但是,我相信我回答了您最初的问题,所以请接受或投票:stackoverflow.com/help/someone-answers。否则,让我知道这个答案还需要什么才能被接受。
    猜你喜欢
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多