我正在尝试从DAO中的远程位置读取xml文件。
<bean id="queryDAO"
class="com.contextweb.openapi.commons.dao.reporting.impl.QueryDAOImpl">
<property name="dataSource" ref="myDS"/>
<property name="inputSource" ref="xmlInputSource"/>
</bean>
<bean id="fileInputStream" class="java.io.FileInputStream">
<constructor-arg index="0" type="java.lang.String"
value="${queriesFileLocation}"/>
</bean>
<bean id="xmlInputSource" class="org.xml.sax.InputSource">
<constructor-arg index="0" >
<ref bean="fileInputStream"/>
</constructor-arg>
</bean>
我第一次能够阅读XML。对于后续请求,输入流已用完。
答案 0 :(得分:2)
希望你知道在spring中,默认情况下所有bean对象都是singleton。因此,请尝试通过在这些bean声明中设置字段singleton="false"
来提及fileInputStream和xmlInputSource为非单例。
答案 1 :(得分:1)
您正在使用问题所在的FileInputStream
。一旦读取了流中的数据,就无法再次读取内容。流已经到了尽头。
解决此问题的方法是使用另一个类BufferedInputStream
,它支持重置指向文件中任何位置的流。
以下示例显示BufferedInputStream
仅打开一次,可用于多次读取文件。
BufferedInputStream bis = new BufferedInputStream (new FileInputStream("test.txt"));
int content;
int i = 0;
while (i < 5) {
//Mark so that you could reset the stream to be beginning of file again when you want to read it.
bis.mark(0);
while((content = bis.read()) != -1){
//read the file contents.
System.out.print((char) content);
}
System.out.println("Resetting ");
bis.reset();
i++;
}
}
有捕获。由于您不是自己使用此类但依赖于org.xml.sax.InputSource
来执行此操作,因此您需要通过扩展此类并覆盖InputSource
和getCharacterStream()
方法来创建自己的getByteStream()
mark()
reset()
要启动文件的流。
答案 2 :(得分:0)
也许您可以尝试内联FileInputStream,以便每次强制一个新实例?
<bean id="queryDAO" class="com.contextweb.openapi.commons.dao.reporting.impl.QueryDAOImpl">
<property name="dataSource" ref="contextAdRptDS"/>
<property name="inputSource">
<bean class="org.xml.sax.InputSource">
<constructor-arg index="0" >
<bean class="java.io.FileInputStream">
<constructor-arg index="0" type="java.lang.String" value="${queriesFileLocation}"/>
</bean>
</constructor-arg>
</bean>
</property>
</bean>