1

春バッチジョブを作成しました。私のリーダー クラスは、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 には、2 つのルート タグ要素が含まれます。

<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 に答える