StaxEventItemWriter消除了由开始/结束文档方法</root>添加的<root>

时间:2012-04-09 07:02:51

标签: spring-batch

我创建了一个弹簧批处理作业。我的读者类从DB读取数据并返回具有以下结构的数据集对象。

@XmlRootElement
@XmlType(propOrder = { "start", "end", "users"})
public class DataSet implements Serializable {

    /**
     * Start datetime of this data set
     */
    private Date start;

    /**
     * End datetime of this data set
     */
    private Date end;

    /**
     * Providers involved in this data set
     */
    private List<User> users;
}

等......并且作者使用StaxEventItemWriter来获取上述数据。 生成的xml包含两个根标记元素。

<root>  //added by the startDocument and endDocument methods from stax writer. 
  <DataSet>......</DataSet>  // from the dataSet xsd annotation.
</root>

我需要消除覆盖startDocument和endDocument方法。

有没有办法通过配置来完成它。请急。

我的作者配置如下。

<bean id="testrWriter" class="com.test.writer.TestWriter"
        scope="step">
<property name="testXMLWriter" ref="testXMLWriter" />
<property name="baseDirectory" value"#{jobParameters['baseDirectory']}"></property>
</bean>

<bean id="testXMLWriter" class="org.springframework.batch.item.xml.StaxEventItemWriter">
   <property name="overwriteOutput" value="true" /> 
   <property name="marshaller" ref="testJaxb2Marshaller" /> 
</bean>

<bean id="testJaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="classesToBeBound">
    <list>
             <value>com.test.service.dto.DataSet</value>
    </list>
   </property> 
</bean

3 个答案:

答案 0 :(得分:2)

我将根设置为!-- --

终于得到了一个有效的xml。

<bean id="delegateWriter" class="org.springframework.batch.item.xml.StaxEventItemWriter">
    <property name="marshaller" ref="someMarshaller" />
    <property name="overwriteOutput" value="true" />
    <property name="RootTagName" value="!-- --"/>
</bean>

答案 1 :(得分:2)

当我设置rootTagName =&#34;! - - &#34;时,我覆盖方法endDocument(XMLEventWriter writer)。然后忽略结束根标记。

protected void endDocument(XMLEventWriter writer) throws XMLStreamException {
            //
    if(this.getRootTagName().equalsIgnoreCase("!-- --")){
        return;
    }
    String nsPrefix = !StringUtils.hasText(getRootTagNamespacePrefix()) ? "" : getRootTagNamespacePrefix() + ":";
    try {

        bufferedWriter.write("</" + nsPrefix + getRootTagName() + ">");
    }
    catch (IOException ioe) {
        throw new DataAccessResourceFailureException("Unable to close file resource: [" + resource + "]", ioe);
    }
}

答案 2 :(得分:1)

回复@ user2922056的解决方案。你不能以这种方式覆盖(无法访问bufferedWriter)。改为调用super方法。

@Override
protected void endDocument(XMLEventWriter writer) throws XMLStreamException {
    if ("!-- --".equalsIgnoreCase(this.getRootTagName())) {
        return;
    } else {
        super.endDocument(writer);
   }
}

由于 RootTagName 之前已设置为值"!-- --",因此方法startDocument()将通过在xml中添加无害注释来完成剩下的工作。