【问题标题】:Spring Batch Writer to write Map<Key,Values> to fileSpring Batch Writer 将 Map<Key,Values> 写入文件
【发布时间】: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 并且对象值现在存储在键值对的 Map 中 例如:姓名-> abc , emailAddress->abc@xyz.com, dob -> 10-10-20

我们尝试使用类似于以下的编写器, 但这里的问题是,由于没有设置 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


    【解决方案1】:

    您需要一个自定义字段集提取器,它可以按照与标题相同的顺序从地图中提取值。 Spring Batch 没有提供这样的提取器,因此您需要自己实现它。例如,您可以在构建时将 headers 传递给提取器,并根据 headers 顺序从 map 中提取值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多