Spring-Batch
におけるFlatFileItemWriter
の実装方法に関して、ググッても全く出てこなかったので仕方なくライブラリのソースを読みつつ実装したので以下に残す。
SampleAggregator.java
public class SampleAggregator implements LineAggregator<SampleInputDto>{
@Override
public String aggregate(SampleInputDto item) {
StringBuilder sb = new StringBuilder();
sb.append(item.getParam1());
sb.append(",");
sb.append(item.getParam2());
sb.append(",");
sb.append(item.getParam3());
return sb.toString();
}
}
SampleBatchConfiguration.java
@Bean
public FlatFileItemWriter<SampleOutputDto> writer() {
FlatFileItemWriter<SampleOutputDto> writer = new FlatFileItemWriter<SampleOutputDto>();
writer.setResource(new FileSystemResource("C:¥tenp¥sample-data.csv"));
writer.setLineAggregator(new SampleAggregator());
return writer;
}
はまったのは、以下の1点。
①LineAggregator
インターフェースをimplements
して、aggregate
メソッドを@Override
したクラスのインスタンスをsetLineAggregator()
で設定しないと(確か)IllegalArgumentExceptionが発生する
@Override
するaggreagete
メソッドの実装内容は、引数に入力のPOJOが渡されるので、ファイルの1行出力内容をString型で返却してやれば良い。
■補足
Java8ならラムダ式が使えるので、いちいちSampleAggregator
クラスを実装するのが面倒くさい場合、以下のようにも書ける。
SampleBatchConfiguration.java
@Bean
public FlatFileItemWriter<SampleOutputDto> writer() {
FlatFileItemWriter<SampleOutputDto> writer = new FlatFileItemWriter<SampleOutputDto>();
writer.setResource(new FileSystemResource("C:¥tenp¥sample-data.csv"));
writer.setLineAggregator(item -> {
StringBuilder sb = new StringBuilder();
sb.append(item.getParam1());
sb.append(",");
sb.append(item.getParam2());
sb.append(",");
sb.append(item.getParam3());
return sb.toString();
});
return writer;
}