[SPRING] Spring Batch를 이용한 복잡한 XML; StaxEventItemWriter; Jaxb2Marshaller
SPRINGSpring Batch를 이용한 복잡한 XML; StaxEventItemWriter; Jaxb2Marshaller
Spring Batch를 사용하여 약간 복잡한 XML을 작성해야한다. 누구든지 적절한 스프링 구성으로 나를 도울 수 있습니까?
아래는 프로세스가 요구하는 출력입니다.
<XML>
<USERLIST ID="something" NAME="Sample">
<USER ID="userID" NAME="Name"/>
<USER ID="userID" NAME="Name"/>
........
</USERLIST>
<XML>
위의 XML에서 'UserList'는 한 번만 발생하면됩니다.
이것은 제가 지금까지 가지고있는 스프링 구성입니다.
<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>
분명히, 내가 테스트 할 때 이러한 모든 USER 개체를 USERLIST 어딘가에 추가해야하기 때문에 내 XML에 'USERLIST'요소가 없습니다. 나는 Spring Batch와 JAXB2에 익숙하다. 이것에 대한 아이디어는 감사하겠습니다.
감사, Harish
해결법
-
==============================
1.이 문제에 대한 해결책은 Spring에서 제공하는 Header / Footer Callback 클래스를 구현하는 것입니다. (Michael Minella가 아래 주석에서 제안했습니다.), StaxWriterCallback 클래스입니다. 아래는 어떻게 구현 한 것입니다.
이 문제에 대한 해결책은 Spring에서 제공하는 Header / Footer Callback 클래스를 구현하는 것입니다. (Michael Minella가 아래 주석에서 제안했습니다.), StaxWriterCallback 클래스입니다. 아래는 어떻게 구현 한 것입니다.
<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>
아래에는 Footer / Header 콜백 클래스 구현이 있습니다.
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!!!"); } } }
원하는 출력을 얻었습니다!
from https://stackoverflow.com/questions/25129185/complex-xml-using-spring-batch-staxeventitemwriter-jaxb2marshaller by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Android 웹 서비스 호출에서 HTTP 406 가져 오기 (0) | 2019.05.19 |
---|---|
[SPRING] SQL 스크립트에서 다른 SQL 파일을 참조 할 수 있습니다. (0) | 2019.05.19 |
[SPRING] 작은 따옴표로 쿼리 매개 변수를 설정하는 방법 (0) | 2019.05.19 |
[SPRING] 스프링 보안 j_spring_security 로그 아웃 문제 (0) | 2019.05.19 |
[SPRING] Axiom과 Spring WS : JAXB가 MTOM 첨부 파일을 인라인합니다. (0) | 2019.05.19 |