Spring 批量 FlatFileItemReader 处理添加到 CSV 的附加字段

Spring Batch FlatFileItemReader Handle Additional Fields Added to CSV

所以我有一个按计划摄取的 csv 文件。 csv 文件有一组列,其名称在 header 行中指定,问题是,新列不断添加到此 csv。目前,当添加新字段时,摄取流程中断并且我得到 FlatFileParseException。我必须进入并使用新的列名更新代码才能让它再次工作。

我想要完成的是,当添加新列时,让代码正确地挑选出它需要的列,而不是抛出异常。

@Bean
@StepScope
FlatFileItemReader<Foo> fooReader(
...
) {

final DelimitedLineTokenizer fooLineTokenizer = new DelimitedLineTokenizer(",") {{
  final String[] fooColumnNames = { "foo", "bar" };
  setNames(fooColumnNames);

  // setStrict(false);
  
}};

return new FlatFileItemReader<>() {{
  setLineMapper(new DefaultLineMapper<>() {{
    setLineTokenizer(fooLineTokenizer);
    setFieldSetMapper(new BeanWrapperFieldSetMapper<>() {{
      setTargetType(Foo.class);
    }});
  }});

  ...

}};
}

我试过在 lineTokenizer 中使用 setStrict(false),这消除了异常,但是问题变成了字段被设置为来自添加的新列的错误值,而不是从中提取数据的原始列。

关于如何向此流程添加更多 fault-tolerance 的任何想法,这样我就不必在每次将列添加到 csv 时不断更新 fooColumnNames

我尝试使用 setStrict(false) 参数修改代码并尝试使用 lineTokenizer 的自定义实现,但在将新列添加到 csv

时仍然难以获得 fault-tolerance

我不知道容错,但可以动态检索列

向您的步骤添加一个侦听器以检索 beforeStep 中的列并将其传递给您的 stepExecutionContext

public class ColumnRetrieverListener implements StepExecutionListener {

    private Resource resource;

    //Getter and setter

    @Override
    public void beforeStep(StepExecution stepExecution) {
        String[] columns = getColumns();
        stepExecution.getExecutionContext().put("columns", columns);
    }

    private String[] getColumns() {
        //Parse first line of resource to get columns
    }
}

使用传递给执行上下文的数据来设置 lineTokenizer

final DelimitedLineTokenizer fooLineTokenizer = new DelimitedLineTokenizer(",") {{
            final String[] fooColumnNames = (String[]) stepExecution.getExecutionContext().get("columns");
            setNames(fooColumnNames);

        }};