我已经编写了一个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。我现在认为它已经用来指定你想如何聚合来自你的阅读器的行。是吗?
提前致谢
答案 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;
}