我创建了一个弹簧批处理作业。我的读者类从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
答案 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中添加无害注释来完成剩下的工作。