は、最終的にはあまり多くのエレガントました溶液。
解決策はLineAggregators
を使用することです。FlatFileItemWriter
の現在の実装では、このクラスを継承するときに安全に使用できるアプローチの1つと思われます。
私は別々のラインアグリゲータをヘッダーにのみ使用しますが、ソリューションは複数のアグリゲーターを使用するように拡張できます。
私のケースでは、ヘッダーはあらかじめ定義された文字列なので、デフォルトでPassThroughLineAggregator
を使用して、文字列をFlatFileItemWriter
に戻します。
public class FlatFileItemWriterWithHeaderOnData extends FlatFileItemWriter {
private LineAggregator lineAggregator;
private LineAggregator headerLineAggregator = new PassThroughLineAggregator();
private boolean applyHeaderAggregator = true;
@Override
public void afterPropertiesSet() throws Exception {
Assert.notNull(headerLineAggregator, "A HeaderLineAggregator must be provided.");
super.afterPropertiesSet();
}
@Override
public void setLineAggregator(LineAggregator lineAggregator) {
this.lineAggregator = lineAggregator;
super.setLineAggregator(lineAggregator);
}
public void setHeaderLineAggregator(LineAggregator headerLineAggregator) {
this.headerLineAggregator = headerLineAggregator;
}
@Override
public void write(List items) throws Exception {
if(applyHeaderAggregator){
LineAggregator initialLineAggregator = lineAggregator;
super.setLineAggregator(headerLineAggregator);
super.write(getHeaderItems());
super.setLineAggregator(initialLineAggregator);
applyHeaderAggregator = false;
}
super.write(items);
}
private List<String> getHeaderItems() throws ItemStreamException {
// your actual implementation goes here
return Arrays.asList("Id,Name,Details");
}
}
PS。この解決策は、方法write()
が呼び出された場合、いくつかのデータが存在すると仮定しています。
を書く最初の一見のためとして、いくつかの問題があります。 1.私たちは、パラメータとしてのみstepExecutionを持っているので、データが存在します場合は、我々は実際にはまだ知らないbeforeStep 2. FlatFileItemWritersは 'open()'メソッドを呼び出すと2つのファイルを作成します – nahab
私が言っているのは、BeforeStepではデータベースをクエリするか、ロジックがあるかどうかでデータがあるかどうかを調べることができます。 FlatFileItemWriterは、2つのファイルを作成せず、スイッチでも両方でもない。 –
私はSPを実行するときにたくさんのデータを持っています。私はこれを2回したくありません。とにかく、これは私の方法ではないようです。 – nahab