ItemWriter没有输出我想要的行

时间:2016-07-21 06:40:25

标签: spring spring-batch

我已经编写了一个Spring批处理作业来从数据库中读取然后写入csv。

该作业有效但不幸的是在我的输出CSV文件中它只是放置我的域对象的toString方法中的任何内容。

我真正追求的是bean中的所有值都用逗号分隔。这就是为什么在我的ItemWriter下面放入DelimitedLineAggregator。

但我认为我对DelimitedLineAggregator的理解是错误的。我认为LineAggregator用于输出,但现在我认为它用于输入数据。

@Bean
@StepScope
public ItemWriter<MasterList> masterListFileWriter(
        FileSystemResource masterListFile,
        @Value("#{stepExecutionContext}")Map<String, Object> executionContext) {

    FlatFileItemWriter<MasterList> writer = new FlatFileItemWriter<>();
    writer.setResource(masterListFile);
    DelimitedLineAggregator<MasterList> lineAggregator = new DelimitedLineAggregator<>();
    lineAggregator.setDelimiter(";");
    writer.setLineAggregator(lineAggregator);
    writer.setForceSync(true);
    writer.open(new ExecutionContext(executionContext));
    return writer;

}

两件事。

我可以更改输出以逗号分隔的MasterList域对象的所有值?是改变toString方法的唯一方法吗?

也可以有人澄清在编剧中使用LineAggregator。我现在认为它已经用来指定你想如何聚合来自你的阅读器的行。是吗?

提前致谢

1 个答案:

答案 0 :(得分:0)

我通过向编写器添加BeanWrapperFieldExtractor来解决这个问题。

@Bean
@StepScope
public ItemWriter<MasterList> masterListFileWriter(
        FileSystemResource masterListFile,
        @Value("#{stepExecutionContext}")Map<String, Object> executionContext) {

    FlatFileItemWriter<MasterList> writer = new FlatFileItemWriter<>();
    writer.setResource(masterListFile);

    DelimitedLineAggregator<MasterList> lineAggregator = new DelimitedLineAggregator<>();
    lineAggregator.setDelimiter(",");

    BeanWrapperFieldExtractor<MasterList> extractor = new BeanWrapperFieldExtractor<MasterList>();
    extractor.setNames(new String[] { "l2", "l2Name"});
    lineAggregator.setFieldExtractor(extractor);

    writer.setLineAggregator(lineAggregator);
    writer.setForceSync(true);

    writer.open(new ExecutionContext(executionContext));

    return writer;

}