如何在Spring中使用变量属性文件名?

时间:2013-03-30 18:39:07

标签: java spring

我正在尝试将应用程序的配置文件与其战争分开。 我想将所有属性文件保存在磁盘上的目录中。然后,战争中所需的唯一属性将是配置目录的路径(假设它将位于名为config.properties的文件中):

config.dir = /home/me/config

现在在spring配置中,我想加载这个文件(以便我知道其他文件的位置),然后是外部文件:

<bean id="propertySourcesPlaceholderConfigurer"
 class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:META-INF/config.properties</value>
            <value>${config.dir}/other.properties</value>
        </list>
    </property>
</bean>

但这不起作用,占位符未解决:

java.io.FileNotFoundException: class path resource [${config.dir}/config.properties] cannot be opened because it does not exist

我还尝试使用类型PropertySourcesPlaceholderConfigurer的单独bean - 它没有多大帮助。

你知道我怎么能做到这一点吗?

2 个答案:

答案 0 :(得分:3)

问题是configurer bean必须先完全构造才能解析上下文中其他bean定义中的占位符,因此不能在configurer的定义中使用占位符表达式来解决需要解决的问题由配置器本身。

您可以将配置目录的路径改为web.xml作为context-param

<context-param>
  <param-name>configDir</param-name>
  <param-value>/home/me/config</param-value>
</context-param>

然后在Spring配置中将其作为#{contextParameters.configDir}访问

<bean id="propertySourcesPlaceholderConfigurer"
 class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>#{contextParameters.configDir}/other.properties</value>
        </list>
    </property>
</bean>

或者您可以使用两个具有不同placeholderPrefix值的独立配置器bean,一个加载config.properties,然后填充另一个@{config.dir}占位符,然后加载外部配置文件。

答案 1 :(得分:2)

可以通过为默认环境注册PropertySource来解决此问题。其中一种方法是使用Java配置:

@Configuration
@PropertySource("classpath:META-INF/config.properties")
public class MyConfig {

}

有了这个,占位符应该得到解决:

<bean id="propertySourcesPlaceholderConfigurer"
 class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>${config.dir}/other.properties</value>
        </list>
    </property>
</bean>