Spring batch StateEventItemWriter消除了由开始/结束文档方法添加的

Spring batch StateEventItemWriter消除了由开始/结束文档方法添加的,spring-batch,Spring Batch,我已经创建了一个spring批处理作业。我的reader类从DB读取数据,并返回具有以下结构的dataset对象 @XmlRootElement @XmlType(propOrder = { "start", "end", "users"}) public class DataSet implements Serializable { /** * Start datetime of this data set */ private Date start;

我已经创建了一个spring批处理作业。我的reader类从DB读取数据,并返回具有以下结构的dataset对象

@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;
}
等等。。。。。。作者使用StatxeventitemWriter对上述数据进行了分析。 生成的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
我将根设置为-

最终得到了一个有效的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>
我将根设置为-

最终得到了一个有效的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>

当我设置rootTagName=!-时,我重写了方法endDocumentXMLEventWriter writer-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);
    }
}

当我设置rootTagName=!-时,我重写了方法endDocumentXMLEventWriter writer-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);
    }
}

回复@user2922056的解决方案。您不能以这种方式覆盖,因为无法访问bufferedWriter。改为调用超级方法

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

因为RootTagName之前已设置为值!--方法startDocument将通过在xml中添加无害的注释来完成其余工作。

回复@user2922056的解决方案。您不能以这种方式覆盖,因为无法访问bufferedWriter。改为调用超级方法

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

因为RootTagName之前已设置为值!--方法startDocument将通过在xml中添加无害的注释来完成其余工作。

因此您基本上希望生成无效的xml,因为您没有根元素:事实上,您所要求的功能并不存在。我想知道StaX是否支持这种没有起始标记的文档。StaxEventItemWriter的startDocument和endDocument添加了这些标记。但我的要求是根元素应该是。。。。如果我在扩展StatexEventItemWriter的类中重写startDocument和endDocument方法,并将该类作为testXMLWriter注入,则会出现预期的结果。如果不重写相同的方法,则可以通过将一些配置放在以下任何一个类中来消除豆子。。。。首先,overwriteOutput默认为true。第二:很遗憾,如果不覆盖startDocument和endDocument,就无法抑制根标记。当您将根标记名设置为!--时,您确定XML输出有效吗?当我尝试时,XML输出中的最后一个标记是,因此XML无效。因此您基本上希望生成无效的XML,因为您没有根元素事实上,您所要求的功能并不存在。我想知道StaX是否支持这种没有起始标记的文档。StaxEventItemWriter的startDocument和endDocument添加了这些标记。但我的要求是根元素应该是。。。。如果我在扩展StatexEventItemWriter的类中重写startDocument和endDocument方法,并将该类作为testXMLWriter注入,则会出现预期的结果。如果不重写相同的方法,则可以通过将一些配置放在以下任何一个类中来消除豆子。。。。首先,overwriteOutput默认为true。第二:很遗憾,如果不覆盖startDocument和endDocument,就无法抑制根标记。当您将根标记名设置为!--时,您确定XML输出有效吗?当我尝试时,XML输出中的最后一个标记是,因此XML无效。最后,使我得到有效XML的解决方案覆盖了endDocument和startDocument两种方法。但是,如果覆盖startDocument,则需要手动写入标题。最后,使我获得有效XML的解决方案覆盖了endDocument和startDocument两种方法。但是如果覆盖startDocument,则需要手动写入头。