Spring batch StateEventItemWriter消除了由开始/结束文档方法添加的
我已经创建了一个spring批处理作业。我的reader类从DB读取数据,并返回具有以下结构的dataset对象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;
@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,则需要手动写入头。