2013-07-05 19 views
7

我以前使用現在不推薦使用的類org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer從服務器的文件系統加載屬性文件。我有以下豆definied:當使用PropertyPlaceholder時,Spring webapp中忽略了Tomcat上下文參數

<bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer"> 
    <property name="locations" value="${config}"/> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/> 
    <property name="ignoreUnresolvablePlaceholders" value="true"/> 
    <property name="searchContextAttributes" value="true"/> 
    <property name="contextOverride" value="false"/> 
    <property name="ignoreResourceNotFound" value="true"/> 
    <property name="searchSystemEnvironment" value="false"/> 
</bean> 

config被啓動Tomcat時所傳遞參數,即

-Dconfig=/path/to/application.properties 

對於web應用程序我也有一個上下文文件:

<Context docBase="/path/to/application.war"> 
    <Parameter name="host" value="localhost" override="false"/> 
    <Parameter name="port" value="8080" override="false"/> 
</Context> 

如果由-Dconfig參數指定的.properties文件包含某些其他bean引用的屬性,那麼將從使用文件,否則使用上下文xml文件中的值。

這讓我有一組使用WAR部署的默認屬性,如果需要,我可以指定一個.properties文件來覆蓋特定的值。

現在,我正在更新使用Spring 3.1中的新屬性抽象,但我似乎無法弄清楚對此的等效方法是什麼?

我有相同的背景文件和戰爭部署以同樣的方式,而我現在已經在應用程序執行以下操作:

<context:property-placeholder 
     location="${config}" 
     system-properties-mode="OVERRIDE" 
     ignore-resource-not-found="true" 
     ignore-unresolvable="true"/> 

此找到並使用從屬性的屬性文件,但它不使用上下文XML文件中的值。

如何讓我的應用程序在使用此新屬性佔位符時使用上下文參數?

謝謝。

回答

4

總而言之,問題是在使用Spring 3.1中引入的新的Property Placeholder名稱空間時,Servlet上下文文件中的Context參數未被用於解析佔位符。

我已經找到了一個解決方案,具有以下

<context:property-placeholder location="${config}" local-override="true" ignore-resource-not-found="true"/> 

我可以使用JVM ARG本地文件系統指定一個或多個* .properties文件,如:

-Dconfig=/path/app.properties 

如果佔位符屬性不能檢查app.properties文件,然後servlet上下文參數進行檢查後得到解決。

這使我可以使用web.xml中的上下文參數具有默認值,並且我可以通過使用config JVM arg指定* .properties文件的位置來覆蓋這些值。

的關鍵在於得到它的工作這種方式是包括local-override="true",其默認爲false。我不能完全肯定這是有道理的,因爲該屬性的描述是:

指定本地屬性是否覆蓋從文件的屬性。默認 是「假」:從文件屬性覆蓋本地默認值。

如果相同的屬性鍵在app.properties並且被用於從所述app.properties的值web.xml存在。

1

除非定義了基於用戶的屬性文件,Spring將使用默認屬性文件。如果你想控制.properties文件,請按照發布的指示here

如果你想利用application.properties有兩種方法可以做到這一點。

<!-- allows for ${} replacement in the spring xml configuration from the 
    system.properties file on the classpath --> 
<util:properties id="appProperties" location="classpath:application.properties"/> 
<context:property-placeholder location="classpath:application.properties"/> 

util標籤允許您使用Property類來讀取應用程序中的屬性。例如:

@Autowired 
public MyPropertyReader(Properties appProperties) { 
    String prop1 = appProperties.getProperty("my.address"); 
    String prop2 = appProperties.getProperty("my.version"); 
} 

如果要使用上下文文件中的值,請使用context:property-placeholder標記。然後你可以使用你的價值觀作爲

<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory" p:brokerURL="${jms.primary.server}"/> 

其中,例如jms.primary.server = 172.168.10.18:6161在application.properties。

+0

我不認爲你已經完全理解我原來的職位。我已經使用屬性文件解決了佔位符。該問題詢問使用上下文參數。 – C0deAttack

+0

您是否遵循了從第一句的鏈接?剩下的答案只是其他使用.properties和application.properties的開發人員的附加組件。 – luksmir

+0

問題是關於上下文參數 - 而不是屬性文件。 – C0deAttack