【发布时间】:2020-12-13 11:43:05
【问题描述】:
我正在使用 Spring 批处理来开发 CSV 提要文件。我使用了类似于下面给出的编写器来生成我的输出文件。
@Bean
public FlatFileItemWriter<CustomObj> writer()
{
BeanWrapperFieldExtractor<CustomObj> extractor = new BeanWrapperFieldExtractor<>();
extractor.setNames(new String[] {"name", "emailAddress", "dob"});
DelimitedLineAggregator<CustomObj> lineAggregator = new DelimitedLineAggregator<>();
lineAggregator.setDelimiter(";");
FieldExtractor<CustomObj> fieldExtractor = createStudentFieldExtractor();
lineAggregator.setFieldExtractor(fieldExtractor);
FlatFileItemWriter<CustomObj> writer = new FlatFileItemWriter<>();
writer.setResource(outputResource);
writer.setAppendAllowed(true);
//writer.setHeaderCallback(headerCallback);
writer.setLineAggregator(lineAggregator);
return writer;
}
输出
name;emailAddress;dob
abc;abc@xyz.com;10-10-20
但是现在我们需要使这个 writer 通用,这样我们就不再传递对象,而是传递一个 Map
我们尝试使用类似于以下的编写器, 但这里的问题是,由于没有设置 FieldExtractor,因此标头和值可能会变得不同步。
PassThroughFieldExtractor 只是以任意顺序传递集合(映射)中的所有值。即使地图包含更多字段,它也会打印所有字段。 在这种情况下,标题和值没有绑定在一起。 有什么方法可以实现自定义字段提取器,即使我们更改标题的顺序,值的顺序也会与标题保持一致。
@Bean
public FlatFileItemWriter<Map<String,String>> writer()
{
DelimitedLineAggregator<Map<String,String>> lineAggregator = new DelimitedLineAggregator<>();
lineAggregator.setDelimiter(";");
FieldExtractor<Map<String,String>> fieldExtractor = createStudentFieldExtractor();
lineAggregator.setFieldExtractor(new PassThroughFieldExtractor<>());
FlatFileItemWriter<Map<String,String>> writer = new FlatFileItemWriter<>();
writer.setResource(outputResource);
writer.setAppendAllowed(true);
writer.setLineAggregator(lineAggregator);
return writer;
}
输出
name;emailAddress;dob
abc@xyz.com;abc;10-10-20
预期输出
case 1:
name;emailAddress;dob
abc;abc@xyz.com;10-10-20
case 2:
emailAddress;dob
abc@xyz.com;10-10-20
【问题讨论】:
标签: spring spring-batch