これのベストプラクティスが何であるかを正確に知っているふりはしませんが、設計の目標を考慮して、これが私が行う方法です。A と B の代わりに、多くの行を含む集合体である File オブジェクトがあるとします。
class File {
public void addLine(Line l) {/* implementation here*/}
public void removeLine(Line l) {/* implementation here*/}
}
class Line {
}
リーダー/プロセッサに LineOperations を返させ、行 (今読んだもの) をカプセル化し、追加/削除/その他を実行しているかどうかを確認します。
interface LineOperation {
public void execute(File file);
}
class DeleteOperation implements LineOperation {
private Line line;
private DeleteOperation(Line line) {
super();
this.line = line;
}
public void execute(File file) {
file.removeLine(line);
}
}
AddOperation の実装と、必要なその他の実装は想像力に任されています。
次に、 LineOperations をライターに渡します。ライターは集約ファイルに対して操作を実行し、次に FileRepository を使用して集約を書き込みます。
class LineOperationWriter implements ItemWriter<LineOperation>, StepExecutionListener {
@Autowired;
FileRepository fileRepo;
private Long fileId;
public void write(List<? extends LineOperation> items) throws Exception {
File file = fileRepo.find(fileId);
for (LineOperation lineOperation : items) {
lineOperation.execute(file);
}
fileRepo.persist(file);
}
@Override
public void beforeStep(StepExecution stepExecution) {
this.fileId = (Long) stepExecution.getJobExecution().getExecutionContext().get("fileId");
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
return null;
}
}
お役に立てれば。