【问题标题】:java spring dependency injection class pathjava spring依赖注入类路径
【发布时间】:2015-03-20 09:27:57
【问题描述】:

我不明白为什么类路径在我的代码中不起作用。我正在尝试使用外部文件资源初始化 MatFileReader。

<bean id="contents" class="org.apache.commons.io.IOUtils" factory-method="toString">
  <constructor-arg 
value="classpath:data/nps/power_spectrum/input.mat" 
type="java.io.InputStream" />
</bean>
<bean id="matInput" class="com.jmatio.io.MatFileReader">
  <constructor-arg 
name="fileName" 
value="classpath:data/nps/power_spectrum/input.mat" />
</bean>

classpath 正在使用第一个 bean (id=contents)。我可以读取 input.mat 文件的内容。但是,在第二个 bean (id=matInput) 中。我得到了FileNotFoundException。看起来编译器未能替换关键字classpath。 MatFileReader 的构造函数将 String 作为参数。如果我使用绝对路径而不是classpath,它可以工作。但是,我想使用classpath,请问如何解决?

【问题讨论】:

  • 你的 bean id 是 id="matInput" 还是 id=matinput
  • 对不起,它是“matInput”。但是,仍然有 FileNotFoundException
  • 您是否尝试将 value="classpath:data/nps/power_spectrum/input.mat" 替换为 value="classpath:/data/nps/power_spectrum/input.mat" ?或使用index=0 insetaad of name='fileName' ?
  • 两种方法都试过了,还是不行。让我感到困惑的是,第一个 id="contents" 的 bean 正在使用相同的 URI。我可以读取该 .mat 文件的内容。但是,那个 MatFileReader 将文件名作为字符串。
  • 看看我的答案并试一试。

标签: java spring dependency-injection


【解决方案1】:

您可以使用ClassPathResource 来读取类路径上的资源。

<bean id="tagProviderResource" class="org.springframework.core.io.ClassPathResource">
    <constructor-arg value="/htmlcleaner.xml" />
</bean>

<util:property-path id="tagProviderFile" path="tagProviderResource.file" />

<bean id="tagProvider" class="org.htmlcleaner.ConfigFileTagProvider">
    <constructor-arg ref="tagProviderFile" />
</bean>

以上代码的更多细节可以在Injecting a File From the Classpath Into a Bean获取。

看看Inject URL for classpath resource

【讨论】:

    【解决方案2】:

    如果 MatFileReader 的构造函数将 String 作为参数,我不确定是否会保留“classpath:”。 你应该只放:

    <constructor-arg name="fileName" value="data/nps/power_spectrum/input.mat" />
    

    然后,当您尝试初始化文件时,您必须进行类似的操作:

    URL url = this.getClass().getResource(filename)
    File file = new File(url.toURI());
    

    或者

    InputStream in = this.getClass().getClassLoader()
                                    .getResourceAsStream(filename);
    

    最后的解决方案是将文件名声明为不是字符串而是资源。 取决于你需要什么

    你所做的是工作,注射是好的。如果我理解正确,那更多的是Java问题。因为你不能用

    初始化文件
    File f = new File("classpath:input.mat");
    

    您必须选择我给出的上述解决方案之一。

    希望有帮助

    【讨论】:

    • 之前我就像你提到的那样初始化 MatFileReader。有用。但是,我正在尝试理解 Spring 依赖注入,并且我想在调用 bean (id="matInput") 时自动注入依赖。
    • 我编辑了我的解决方案,我认为这更像是 Java 问题而不是 Spring 问题
    猜你喜欢
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多