FlatFileItemWriterを使っていて、Writerに渡されるitem一つに対して複数行書き出したい時がある。
ItemのフィールドにあるListの要素の数だけ、書き出したい場合など。
自前で、LineAggregatorを実装して解決してみる。
実装例
public class SampleEntity {
private String id;
private List<SampleDto> list;
....
}
public class SampleDto {
private String skuCode;
private String name;
private String validFlag;
....
}
public class MultiLineAggregator implements LineAggregator<SampleEntity> {
private static final String DEFAULT_LINE_SEPARATOR = System.getProperty("line.separator");
@Override
public String aggregate(SampleEntity item) {
StringBuilder sb = new StringBuilder();
for (SampleDto dto : item.getList().values()) {
sb.append(item.getId()); // itemのフィールドを書き出し
sb.append(DelimitedLineTokenizer.DELIMITER_TAB);
sb.append(dto.getSkuCode());
sb.append(DelimitedLineTokenizer.DELIMITER_TAB);
sb.append(dto.getName());
sb.append(DelimitedLineTokenizer.DELIMITER_TAB);
sb.append(dto.getValidFlag());
sb.append(DEFAULT_LINE_SEPARATOR);
}
return StringUtils.chomp(sb.toString()); // 最後の改行コードを削る
}
}
Spring Batchの設定例
<bean id="couponSkuWriter" class="org.springframework.batch.item.file.FlatFileItemWriter">
<property name="resource" value="file:${output.base.path}/${fileName}" />
<property name="shouldDeleteIfEmpty" value="true"/>
<property name="lineAggregator">
<bean class="jp.canetrash.sample.batch.impl.transform.MultiLineAggregator" />
</property>
</bean>