【问题标题】:Spring Batch more output records than input recordsSpring Batch 输出记录多于输入记录
【发布时间】:2019-12-17 15:20:41
【问题描述】:

我正在使用 Spring Batch。我必须阅读一些复杂的 xml 文件并将它们写入数据库。 xml 文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<KCO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:///C:/DEV/schema.xsd">
    <Header/>
    <Body>
        <KC kc_id="">
            <KA ka_id="">
                <Kd kd_id="">
                    <Va va_id="">
                        <Pa pa_id=""/>
                        <Pa pa_id=""/>
                        <Pa pa_id=""/>
                    </Va>
                    <Va va_id="">
                        <Pa pa_id=""/>
                    </Va>
                </Kd>
                <Kd kd_id="">
                    <Va va_id="">
                        <Pa pa_id=""/>
                        <Pa pa_id=""/>
                        <Pa pa_id=""/>
                    </Va>
                </Kd>
            </KA>
            <KA ka_id="">
                <Kd kd_id="">
                    <Va va_id="">
                        <Pa pa_id=""/>
                        <Pa pa_id=""/>
                    </Va>
                </Kd>           
            </KA>
        </KC>
    </Body>
</KCO>

根元素是 KCO。对于每个 Pa 元素,我必须创建一个输出记录。该记录包含来自所有父元素(Va、Kd、KA、KC、Body 和 Header)的信息。 KA、Kd、Va 和 Pa 有多个元素。我尝试在 ItemProcessor 中拆分 KC 元素,但这不是一个好主意,对吧?在某处我读到输入记录和输出记录的数量必须相等。 有没有人知道如何解决这个问题?

这是我的代码:

@Bean
@StepScope
public StaxEventItemReader<KCO> itemReader(
        @Value("#{jobParameters['InputPath']}") String inputPath) {     
    return new StaxEventItemReaderBuilder<KCO>()
            .name("itemReader")
            .resource(new FileSystemResource(inputPath))
            .addFragmentRootElements("KCO")
            .unmarshaller(primaMarshaller())
            .build();
}

@Bean
public Jaxb2Marshaller primaMarshaller() {      
    Jaxb2Marshaller pm = new Jaxb2Marshaller();
    pm.setClassesToBeBound(KCO.class);      
    return pm;      
}

@Bean
public KMPItemProcessor itemProcessor() {
    return new KMPItemProcessor();
}

@Bean
public JpaItemWriter<KonditionMP> itemWriter() {
    JpaItemWriter<KonditionMP> writer = new JpaItemWriter<KonditionMP>();
    writer.setEntityManagerFactory(emf);
    return writer;
}

【问题讨论】:

  • Somewhere I read that the amount of input records and output records has to be equal 这没有必要。一个输入项可以转换为多个输出项,您最终会得到比输入记录更多的输出记录。如果你设法让你的项目处理器返回每个项目的记录列表,那么你可以使用这样的东西:*.com/questions/37866312/…
  • @MahmoudBenHassine:谢谢,这个技巧对我帮助很大。

标签: java xml jpa spring-batch


【解决方案1】:

我的问题的答案在这里: Spring Batch - Using an ItemWriter with List of Lists

据此 Mahmoud Ben Hassine 评论。

【讨论】: