1

我创建了一个 spring-batch 作业。我的阅读器类从数据库中读取数据并返回具有以下结构的数据集对象。

@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
4

3 回答 3

3

我将根设置为!-- --

终于得到了一个有效的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>
于 2012-05-18T22:41:11.567 回答
2

当我设置 rootTagName = "!-- --" 然后忽略结束根标记时,我覆盖了方法 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);
    }
}
于 2014-04-15T09:15:54.987 回答
1

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

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

As the RootTagName has been setted before to the value "!-- --" the method startDocument() will do the rest by adding a harmless comment in the xml.

于 2017-08-24T08:19:15.153 回答