2009-08-21 195 views
12

我需要從一個我不知道的位置加載一些屬性到Spring上下文中,直到程序運行。另一個屬性的屬性佔位符位置

所以我想,如果我有沒有地方提供一個PropertyPlaceholderConfigurer,將在my.location從系統屬性讀取,然後我可以使用的背景下,地點:房產佔位符

喜歡這個

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>  
<context:property-placeholder location="${my.location}"/> 

但這並不工作,也不location="classpath:${my.location}"

保羅

+0

您將無法將兩個佔位符組合在一起 - 它們是BeanFactoryPostProcessors,如果您明白我的意思,它們將無法處理對方。 – skaffman 2009-08-21 11:35:37

+0

是的,我想我的問題是沿着這些線 – 2009-08-21 13:00:16

+0

其實,這聽起來像PropertyPlaceHolderConfigurer的增強,可能是值得作爲春季JIRA中的功能請求歸檔。 – skaffman 2009-08-21 14:18:00

回答

5

這裏的問題是,您正嘗試使用屬性佔位符語法來配置屬性佔位符:)它有點雞雞蛋情況 - 彈簧無法解析您的${my.location}佔位符,直到它被配置爲屬性佔位符。

這是不盡如人意,但你可以通過使用更明確的語法bodge它:

<bean class="org.springframework.beans.factory.config.PropertyPlaceHolderConfigurer"> 
    <property name="location"> 
     <bean class="java.lang.System" factory-method="getenv"> 
     <constructor-arg value="my.location"/> 
     </bean> 
    </property> 
</bean> 
+0

不能令人滿意,但至少可以工作 – 2009-08-21 11:29:23

+0

對於使用Spring 3.1.3的人不適用:'org.springframework.beans.NotWritablePropertyException:bean類的無效屬性'location'[org.springframework.beans.factory.config .PropertyPlaceholderConfigurer]:Bean屬性'location'不可寫,或者具有無效的setter方法。 setter的參數類型是否與getter的返回類型匹配?' – 2012-11-14 12:32:33

15

您可以用稍微不同的方式做到這一點。這是我們如何配置它。我加載默認屬性,然後用可配置位置的屬性覆蓋它們。這對我很好。

<bean id="propertyPlaceholderConfigurer" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
     <property name="locations"> 
      <list> 
       <value>classpath:site/properties/default/placeholder.properties 
       </value> 
       <value>classpath:site/properties/${env.name}/placeholder.properties 
       </value> 
      </list> 
     </property> 
    </bean> 
+0

+1 - 我已經完成了。效果很好。 – 2009-08-26 15:41:32