簡體   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