【问题标题】:Autowire a classpath directory / File to a Bean将类路径目录/文件自动装配到 Bean
【发布时间】:2014-07-09 09:00:52
【问题描述】:

我有一个简单的 Spring bean

public class Widget {   
    public Widget(File rootDir) { ... }
}

在我的应用程序上下文 XML 中,我想创建一个 Widget 的实例:

<bean id="widget" class="com.example.Widget">
    <constructor-arg type="java.io.File" value="classpath:/someDir"/>
</bean>

当我从我的 IDE 运行时,它可以工作,字符串被转换为文件并传递给 ctor。

当我用mvn exec:java 运行它时,找不到文件,我得到了各种各样的错误,但是围绕着:

org.springframework.beans.factory.BeanCreationException: 错误 使用在类路径中定义的名称小部件创建 bean 资源 [META-INF/context.xml]:无法解析匹配 构造函数(提示:为简单指定索引/类型/名称参数 避免类型歧义的参数)


那么,如何在 Spring 中将 classpath 文件(实际上是目录)传递给 bean 构造函数? 我需要一个目录,因为我想扫描它/列出其中的所有文件。

【问题讨论】:

  • 短版:您不能将File 与罐子内的资源一起使用。
  • @chrylis 哦,真难过。如何打开对类路径上/someClassPathDir 中的all 文件的访问权限(例如,获取Reader)?

标签: java spring maven autowired


【解决方案1】:

那么,如何将类路径文件(实际上是目录)传递给 bean Spring中的构造函数?我需要一个目录,因为我想扫描 它/列出其中的所有文件。

我不知道这是否可能,但您可以使用 Spring 获取类路径上与模式匹配的所有资源。见PathMatchingResourcePatternResolver。请参阅有关使用 Ant-style wildcards 的文档。

为你的构造函数试试这个:

import org.springframework.core.io.Resource;
...
public Widget(Resource[] resources) { ... }

在您的 XML 中,类似这样的内容(更改 Ant 模式以匹配您的用例):

<bean id="widget" class="com.example.Widget">
    <constructor-arg>
        <list>
              <value>classpath:/someDir/*.foo</value>
        </list>
    </constructor-arg>
</bean>

在使用它之前,我建议您查看 PathMatchingResourcePatternResolver Javadocs 中提到的与非文件系统资源相关的警告。

【讨论】:

    猜你喜欢
    • 2019-03-28
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多