spring - 使用 Spring Batch 的复杂 XML; StaxEventItemWriter ; Jaxb2编码器

标签 spring spring-batch jaxb2

我需要使用 Spring Batch 编写一个稍微复杂的 XML。谁能帮我进行适当的 Spring 配置?

下面是过程需要的输出。

<XML>
<USERLIST ID="something" NAME="Sample">
  <USER ID="userID" NAME="Name"/>
  <USER ID="userID" NAME="Name"/>
  ........
</USERLIST>
<XML>

上面XML中的'UserList'只需要出现一次

这是我目前的 spring 配置。

<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 有点陌生。对此有任何想法表示赞赏。

谢谢, 哈里什

最佳答案

这个问题的解决方案是实现 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>  

下面是页脚/页眉回调类的实现

 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 - 使用 Spring Batch 的复杂 XML; StaxEventItemWriter ; Jaxb2编码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25129185/

相关文章:

java - SpringBoot BeanCreationException : Error creating bean with name 'requestMappingHandlerAdapter' Caused by: java. lang.NoSuchFieldError: defaultInstance

java - spring远程分区策略如何在不同机器上启动slave

maven-3 - 通过maven编译时出现SAXParseException

xml - JAXB:如何围绕 XmlRootElement 添加包装器?

java - 从 sFtp 服务器读取文件

java - 在 Spring MVC Controller 中注入(inject) Jaxb2Marshaller

java - Spring MVC 中的多 DispatcherServlet (Java 配置)

spring - 当从 weblogic12c(12.1.3) 移动到 weblogic12cR2 (12.2.1) 时,基于注释/java 配置的应用程序开始查找 xml 配置文件

json - Spring MVC(或 Spring Boot)。针对安全相关异常的自定义 JSON 响应,例如 401 Unauthorized 或 403 Forbidden)

java - 使用 Spring Batch 将文件中的日期解析为 LocalDateTime