LoginSignup
1
1

More than 5 years have passed since last update.

Spring Batch:FlatFileItemWriterで一つのItemで複数行書き出したいとき

Last updated at Posted at 2014-05-07

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>
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1