我需要从db读取数据,然后生成XLSX文件并在db。中更新数据。
读者部分没有问题。
对于编写器部分,我最终创建了一个CompositeItemWriter
,由生成XLSX文件的第一个Writer
和更新db中的数据的第二个CompositeItemWriter
组成。
问题:我需要拦截第一个编写器的前后步骤,以便能够以块的形式正确写入XLSX文件。但是,只要我将两个作者组成@BeforeStep
,就不会调用使用@AfterStep
et StepExecutionListener
注释的方法。
制作第一个编写器public CompositeItemWriter<Adhesion> compositeItemWriter() {
CompositeItemWriter writer = new CompositeItemWriter();
writer.setDelegates(Arrays.asList(adhesionToXlsWriter, adhesionToDbWriter));
return writer;
}
@Bean
public Step xlsStep(ItemReader<Adhesion> adhesionFromDbReader) {
return stepBuilderFactory.get(JOB_NAME + "-step")
.<Adhesion, Adhesion>chunk(10)
.reader(adhesionFromDbReader)
.writer(compositeWriter())
.build();
}
@Component
public class AdhesionToXlsWriter implements ItemWriter<Adhesion> {
@BeforeStep
public void beforeStep(StepExecution stepExecution) {
// !! never called !!
}
@Override
public void write(List<? extends Adhesion> items) throws Exception {
// generate XLSX content
}
@AfterStep
public ExitStatus afterStep(StepExecution stepExecution) {
// !! never called !!
}
}
时的相同问题。
知道为什么吗?
下面是CompositeItemWriter定义,步骤和编写器:
<div style="height: 100%; display: flex; align-items: center; justify-content: center;">
<div>
Some vertical and horizontal aligned text
</div>
</div>
答案 0 :(得分:3)
您需要将XslWriter注册为该步骤的侦听器。使用&#34;听众&#34; stepBuilder的方法。
如果作家,读者,处理器被隐藏&#34;在复合类后面,spring框架不会自动将其识别为侦听器。因此,您必须手动操作&#34;。