Java 如何在Spring Batch ItemWriter中为子bean编写多个XML文件?
我有一个批处理作业,它从数据库检索记录,处理它们,并将结果传递给编写器。传递给编写器的bean有四个字段,需要将它们写入单独的xml文件。其中一个字段是表示原始记录的bean,另外三个字段是与记录关联的子元素的集合 我最初尝试使用jackson解析bean并生成文件,但我发现这种方法在应用于批处理模型时遇到了问题 接下来,我转而为每个子字段使用Java 如何在Spring Batch ItemWriter中为子bean编写多个XML文件?,java,xml,spring,spring-batch,itemwriter,Java,Xml,Spring,Spring Batch,Itemwriter,我有一个批处理作业,它从数据库检索记录,处理它们,并将结果传递给编写器。传递给编写器的bean有四个字段,需要将它们写入单独的xml文件。其中一个字段是表示原始记录的bean,另外三个字段是与记录关联的子元素的集合 我最初尝试使用jackson解析bean并生成文件,但我发现这种方法在应用于批处理模型时遇到了问题 接下来,我转而为每个子字段使用statxeventitemwriters,这似乎已经足够了,但是我在实现一个能够处理所有子类型的writer时遇到了困难。我已经研究了Composite
statxeventitemwriter
s,这似乎已经足够了,但是我在实现一个能够处理所有子类型的writer时遇到了困难。我已经研究了CompositeItemWriter
和ClassifierCompositeItemWriter
,但它们似乎更适合为同一类型的bean使用多个编写器,而我需要多个适合不同类型的编写器。任何建议都将不胜感激
域示例:
public class MyBean {
private RecordBean recordBean;
private List<ChildTypeA> aBeans;
private List<ChildTypeB> bBeans;
private List<ChildTypeC> cBeans;
}
@XmlRootElement(name = "RECORD")
public class RecordBean extends MyAbstractBean {
@XmlElement(name = "ID")
private String recordId;
@XmlElementWrapper(name = "A_CHILDREN")
@XmlElement(name="CHILD_TYPE_A")
List<Long> aChildIds}
@XmlElementWrapper(name = "B_CHILDREN")
@XmlElement(name="CHILD_TYPE_B")
List<Long> bChildIds}
@XmlElementWrapper(name = "C_CHILDREN")
@XmlElement(name="CHILD_TYPE_C")
List<Long> cChildIds}
}
@XmlRootElement(name = "CHILD_TYPE_A")
public class ChildTypeA extends MyAbstractBean {
@XmlElement(name = "ID") private String aId;
}
@XmlRootElement(name = "CHILD_TYPE_B")
public class ChildTypeB extends MyAbstractBean {
@XmlElement(name = "ID") private String bId;
}
@XmlRootElement(name = "CHILD_TYPE_C")
public class ChildTypeC extends MyAbstractBean {
@XmlElement(name = "ID") private String cId;
}
record_2.xml
<?xml version="1.0" encoding="UTF-8"?>
<RECORD>
<ID>2</ID>
<A_CHILDREN>
<CHILD_TYPE_A>3</CHILD_TYPE_A>
<CHILD_TYPE_A>4</CHILD_TYPE_A>
</A_CHILDREN>
<B_CHILDREN>
<CHILD_TYPE_B>3</CHILD_TYPE_B>
<CHILD_TYPE_B>4</CHILD_TYPE_B>
</B_CHILDREN>
<A_CHILDREN>
<CHILD_TYPE_C>3</CHILD_TYPE_C>
<CHILD_TYPE_C>4</CHILD_TYPE_C>
</A_CHILDREN>
</RECORD>
</xml>
2.
3.
4.
3.
4.
3.
4.
a_children.xml
<?xml version="1.0" encoding="UTF-8"?>
<A_CHILDREN>
<CHILD_TYPE_A>
<ID>1</ID>
</CHILD_TYPE_A>
<CHILD_TYPE_A>
<ID>2</ID>
</CHILD_TYPE_A>
<CHILD_TYPE_A>
<ID>3</ID>
</CHILD_TYPE_A>
<CHILD_TYPE_A>
<ID>4</ID>
</CHILD_TYPE_A>
</A_CHILDREN>
</xml>
<!-- Decide which format to use -->
1.
2.
3.
4.
b_children.xml和c_children.xml与a_children.xml是一样的。所以在两天的大部分时间后,我决定采取不同的方法。我认为可以创建一组编写器来处理该任务,但我认为这需要大量的定制和复杂的委托层次结构 例如:
委托:CompositeItemWriter
分类并委托:分类组件编写器
用于儿童类型Astatxeventitemwriter
用于儿童类型Bstatxeventitemwriter
用于ChildTypeCstatxeventitemwriter
为每个RecordBean动态分配文件系统资源MultiResourceItemWriter
@Component
@Scope("step")
public class MyXmlWriter implements ItemWriter<MyBean> {
@Override
public void write(List<? extends MyBean> beans) throws Exception {
for(MyBean bean : beans) {
this.writeRecordBean(bean.getRecordBean());
bean.getAChildIds().forEach(a -> this.writeElement(a, pathA));
bean.getBChildIds().forEach(b -> this.writeElement(b, pathB));
bean.getCChildIds().forEach(c -> this.writeElement(c, pathC));
}
}
private void writeElement(Long Id, Path path) {
// Handle serialization and FileIO here
}
.
.
.
}
@组件
@范围(“步骤”)
公共类MyXmlWriter实现ItemWriter{
@凌驾
公共空白写入(列表)
@Component
@Scope("step")
public class MyXmlWriter implements ItemWriter<MyBean> {
@Override
public void write(List<? extends MyBean> beans) throws Exception {
for(MyBean bean : beans) {
this.writeRecordBean(bean.getRecordBean());
bean.getAChildIds().forEach(a -> this.writeElement(a, pathA));
bean.getBChildIds().forEach(b -> this.writeElement(b, pathB));
bean.getCChildIds().forEach(c -> this.writeElement(c, pathC));
}
}
private void writeElement(Long Id, Path path) {
// Handle serialization and FileIO here
}
.
.
.
}