Spring 批处理的输出记录多于输入记录
Spring Batch more output records than input records
我正在使用 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;
}
我的问题的答案在这里:
据此 Mahmoud Ben Hassine 评论。
我正在使用 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;
}
我的问题的答案在这里:
据此 Mahmoud Ben Hassine 评论。