2013-03-30 50 views
1

我試圖將應用程序的配置文件與其戰爭分開。 我想將所有屬性文件保存在磁盤上的一個目錄中。然後,在戰爭中所需的唯一屬性將是該路徑配置目錄(假設這將是在一個名爲config.properties文件):如何在Spring中使用變量屬性文件名?

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

這可以通過爲默認環境註冊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> 
3

問題是配置器bean必須先完全構造,然後才能解析上下文中其他bean定義中的佔位符,因此您不能在需要配置器的定義中使用佔位符表達式由配置器本身解決。

你可以改爲放置的路徑,你的配置目錄到web.xmlcontext-param

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

,然後在你的Spring配置

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

訪問它#{contextParameters.configDir}或者你可以做它帶有兩個單獨的配置器beans,其值爲placeholderPrefix,其中一個加載config.properties,然後填充另一箇中的@{config.dir}佔位符,然後加載外部配置文件。

相關問題