将xml文件注入spring bean

时间:2012-08-07 07:46:51

标签: java spring file-io

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

3 个答案:

答案 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来执行此操作,因此您需要通过扩展此类并覆盖InputSourcegetCharacterStream()方法来创建自己的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>