我有一个由Spring创建的bean。实际的类驻留在与Spring不同的JAR中。此bean作为构造函数参数传递路径。但是,我在检索文件句柄时遇到了困难。该文件位于WEB-INF / classes /中。我已经尝试过基于WEB-INF的相对路径,但显然这不起作用。
XML:
<bean id="configurationManager" class="package.ConfigurationManager"
scope="singleton">
<property name="configurationMapping">
<bean class="package.PropertiesFileConfigurationMapper">
<constructor-arg type="java.lang.String">
<value>/path/to/file</value>
</constructor-arg>
</bean>
</property>
</bean>
豆:
public class ConfigurationMapper {
public ConfigurationMapper(String resource) {
_map = new HashMap<String, String>();
String property = null;
BufferedReader reader = null;
try {
FileReader file = new FileReader(resourcePath);
reader = new BufferedReader(file);
while ((property = reader.readLine()) != null) {
if (property.matches("(.+)=(.+)")) {
String[] temp = property.split("(.+)=(.+)");
_map.put(temp[0], temp[1]);
}
}
} catch (Exception ex){
ex.printStackTrace();
} finally {
if (reader != null)
reader.close();
}
}
//other methods to manipulate settings
}
如何获取rm.properties
文件的正确路径并在运行时将其传递给bean?
编辑:添加了构造函数代码。
编辑:我明白了。我将构造函数参数更改为不再采用路径。它现在需要一个资源,所以Spring找到了我想要加载的资源。
答案 0 :(得分:6)
java.io.File
和FileReader
仅适用于实际文件。打包在JAR文件中的资源本身不是文件。
加载它的最简单方法是作为类路径资源:
替换它:
FileReader file = new FileReader(resourcePath);
reader = new BufferedReader(file);
有这样的事情:
InputStream inputStream = getClass().getResourceAsStream();
reader = new BufferedReader(new InputStreamReader(inputStream));
更好的是,使用Spring的Resource
抽象,将构造函数参数声明为org.springframework.core.io.Resource
:
public ConfigurationMapper(Resource resource) {
...
InputStream inputStream = resource.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream));
然后提供路径:
<constructor-arg value="classpath:/path/to/file"/>
Spring将自动为该路径创建ClasspathResource
(使用类路径),并将其传递给构造函数。
答案 1 :(得分:0)
Spring有一个复杂的资源声明。您可以使用自己的想法声明文件,类路径或扩展它。一切都基于资源URI。由于您的文件位于jar文件中,因此您可以使用classpath加载它:
<bean class="package.PropertiesFileConfigurationMapper">
<constructor-arg>
<value>classpath:/path/to/file/in/jar</value>
</constructor-arg>
</bean>
现在修改构造函数以获取java.io.InputStream。
public ConfigurationMapper(InputStream resource) {
BufferedReader reader = new BufferedReader( new InputStreamReader( resource ) );
....
}