如何获取属性文件的路径并在运行时将其传递给bean

taf*_*o85 2 java spring

我有一个由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> 
Run Code Online (Sandbox Code Playgroud)

豆:

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
}
Run Code Online (Sandbox Code Playgroud)

如何获取rm.properties文件的正确路径并在运行时将其传递给bean?

编辑:添加构造函数代码.

编辑:我明白了.我将构造函数参数更改为不再采用路径.它现在需要一个资源,所以Spring找到了我想要加载的资源.

ska*_*man 6

java.io.File并且FileReader仅适用于实际文件.打包在JAR文件中的资源本身不是文件.

加载它的最简单方法是作为类路径资源:

替换这个:

FileReader file = new FileReader(resourcePath);
reader = new BufferedReader(file);
Run Code Online (Sandbox Code Playgroud)

用这样的东西:

InputStream inputStream = getClass().getResourceAsStream();
reader = new BufferedReader(new InputStreamReader(inputStream));
Run Code Online (Sandbox Code Playgroud)

更好的是Resource,通过将构造函数参数声明为org.springframework.core.io.Resource:使用Spring的抽象:

public ConfigurationMapper(Resource resource) {
   ...
   InputStream inputStream = resource.getInputStream();
   reader = new BufferedReader(new InputStreamReader(inputStream));
Run Code Online (Sandbox Code Playgroud)

然后,当您提供路径时:

<constructor-arg value="classpath:/path/to/file"/>
Run Code Online (Sandbox Code Playgroud)

Spring将自动ClasspathResource为该路径创建一个(使用类路径),并将其传递给构造函数.