1

我正在尝试从我的 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。对于后续请求,输入流已用尽。

4

3 回答 3

2

希望你知道在春天,默认情况下所有的 bean 对象都是单例的。singleton="false"因此,请尝试通过在这些 bean 声明中设置字段来将 fileInputStream 和 xmlInputSource 提及为非单例。

于 2012-08-07T07:53:03.393 回答
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创建自己的类以开始文件。InputSourcegetCharacterStream()getByteStream()mark() reset()

于 2012-08-07T14:14:42.060 回答
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>
于 2012-08-07T07:53:28.870 回答