使用Spring Batch的复杂XML; StaxEventItemWriter; Jaxb2Marshaller [英] Complex XML using Spring Batch; StaxEventItemWriter ; Jaxb2Marshaller
问题描述
我需要使用Spring Batch编写稍微复杂的XML。任何人都可以帮助我使用适当的Spring配置吗?
I need to write a slightly complex XML using Spring Batch. Can anyone please help me with the appropriate Spring configuration?
以下是该流程所需的输出。
Below is the Output the process requires.
<XML>
<USERLIST ID="something" NAME="Sample">
<USER ID="userID" NAME="Name"/>
<USER ID="userID" NAME="Name"/>
........
</USERLIST>
<XML>
上面的XML中的'UserList'只需要发生一次
The 'UserList' in the XML above only needs to occur once
这是我到目前为止的弹簧配置。
This is the spring configuration I have so far.
<bean id="userXMLWriter" class="org.springframework.batch.item.xml.StaxEventItemWriter">
<property name="resource" value="file:outputs/users.xml" />
<property name="encoding" value="ISO-8859-1" />
<property name="version" value="1.0" />
<property name="marshaller" ref="userXMLMarshaller" />
<property name="rootTagName" value="XML" />
</bean>
<bean id="userXMLMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="marshallerProperties">
<map>
<entry>
<key>
<util:constant static-field="javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT" />
</key>
<value type="java.lang.Boolean">true</value>
</entry>
</map>
</property>
<property name="classesToBeBound">
<list>
<value>org.test.model.xml.UserList</value>
<value>org.test.model.xml.User</value>
</list>
</property>
</bean>
显然,当我测试这个时,我的XML中没有'USERLIST'元素,因为所有这些USER对象需要在某处添加到USERLIST。我是Spring Batch和JAXB2的新手。任何想法都是值得赞赏的。
Obviously, when I test this my XML does not have the 'USERLIST' element in it because all these USER objects need to be added to the USERLIST somewhere. I am kinda new to Spring Batch and JAXB2. Any ideas on this is appreciated.
谢谢,
Harish
Thanks, Harish
推荐答案
这个问题的解决方案是实现Spring提供的Header / Footer Callback类(正如Michael Minella在下面的评论中所建议的那样<。strong>。),在我的案例中是StaxWriterCallback类。以下是我如何实现它。
The solution to this problem is to implement Header/Footer Callback classes provided by Spring (As Michael Minella suggested in the comments below.), StaxWriterCallback class in my case. Below is How I've implemented it.
<bean id="userXMLWriter" class="org.springframework.batch.item.xml.StaxEventItemWriter">
<property name="resource" value="file:outputs/users.xml" />
<property name="encoding" value="ISO-8859-1" />
<property name="version" value="1.0" />
<property name="marshaller" ref="userXMLMarshaller" />
<property name="headerCallback" ref="UserXMLHeaderCallBack" />
<property name="footerCallback" ref="UserXMLFooterCallBack"/>
<property name="rootTagName" value="XML" />
</bean>
<bean id="UserXMLHeaderCallBack" class ="org.test.writers.UserXMLHeaderCallBack"/>
<bean id="UserXMLFooterCallBack" class ="org.test.writers.UserXMLFooterCallBack"/>
<bean id="userXMLMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>org.test.model.xml.User</value>
</list>
</property>
</bean>
以下是页脚/页眉回调类的实现
And below are the Footer/Header callback classes implementation
public class UserXMLHeaderCallBack implements StaxWriterCallback{
@Override
public void write(XMLEventWriter writer) throws IOException {
try{
XMLEventFactory eventFactory = XMLEventFactory.newInstance();
Attribute id = eventFactory.createAttribute("ID", "someId");
Attribute name = eventFactory.createAttribute("NAME", "someName");
List<Attribute> attributeList = Arrays.asList(id, name);
List<?> nsList = Arrays.asList();
XMLEvent event = eventFactory.createStartElement("", "", "USERLIST",attributeList.iterator(), nsList.iterator());
writer.add(event);
}catch(XMLStreamException e){
System.err.println("Something went nuts!!!");
}
}
}
页脚等级
public class UserXMLFooterCallBack implements StaxWriterCallback{
@Override
public void write(XMLEventWriter writer) throws IOException {
try{
XMLEventFactory eventFactory = XMLEventFactory.newInstance();
XMLEvent event = eventFactory.createEndElement("", "", "USERLIST");
writer.add(event);
}catch(XMLStreamException e){
System.err.println("Something went nuts!!!");
}
}
}
我获得了所需的输出!
这篇关于使用Spring Batch的复杂XML; StaxEventItemWriter; Jaxb2Marshaller的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!