복붙노트

[SPRING] Spring Batch를 이용한 복잡한 XML; StaxEventItemWriter; Jaxb2Marshaller

SPRING

Spring 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. ==============================

    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!!!");
            }
        }
    
    }
    

    원하는 출력을 얻었습니다!

  2. from https://stackoverflow.com/questions/25129185/complex-xml-using-spring-batch-staxeventitemwriter-jaxb2marshaller by cc-by-sa and MIT license