2009-08-28 90 views
1

我有一個基於Spring的Web應用程序,applicationContext.xml和myServlet-servlet.xml包含應該由部署中的sysadmin配置的設置。使用sysadmin定義屬性配置基於Spring的servlet

在不需要編輯WAR內容的情況下,啓用諸如[數據庫服務器詳細信息,遠程web服務端點等]的設置更改的最佳方式是什麼?

Spring提供了PropertyPlaceholderConfigurer它可以在bean配置中使用,但我認爲這將需要屬性文件的絕對路徑,我想避免它,如果除了允許多個實例同一個servlet在同一臺機器上運行。

也可以選擇使用JNDI配置的資源,儘管看起來這不是一個開箱即用的BeanFactoryPostProcessor實現,所以它可能不是一個很好的方法來處理它。

如果有的話,標準最佳實踐是如何處理這種需求的?

相關SO條目:

How can I specify system properties in Tomcat configuration on startup?

回答

1

您還可以通過基於文件的解決方案實現此目的。在每個環境中定義一個環境名稱系統屬性。然後使用該名稱來加載外部屬性文件。下面的示例加載一個默認設置,然後使用特定於環境的設置進行覆蓋。

<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>file:///site/properties/${env.name}/placeholder.properties 
        </value> 
      </list> 
    </property> 
</bean> 

改編自,我的回答here

+0

不錯,實際上並不需要將環境配置置於固定的根位置,/ site/properties就像$ {env.applicationRoot}/config一樣簡單。我喜歡 – ptomli 2009-08-28 11:27:53

1

「?什麼是使不需要的WAR內容的編輯,例如[數據庫服務器的詳細信息,遠程web服務端點,等]的設置改變的最佳途徑」

要做到這一點的唯一方法是外部化配置。您可以分解WAR文件,將.properties文件移到WAR外部(只要它在CLASSPATH中,Spring會找到它),或者將可修改的值放入數據庫中。

+0

數據庫設置是最好的選擇。 – Martlark 2009-08-28 09:59:26

+1

我不確定我是否同意將配置詳細信息(如數據庫設置)放入數據庫是最好的方法。無限遞歸的位... – ptomli 2009-08-28 10:14:11

+0

您必須在某處引導它。配置數據庫可能是也可能不是應用程序使用的那個。 – duffymo 2009-08-28 21:50:22

0

如果你不希望你的外部化屬性文件:

我使用的是代表我的財產我的部署環境的前綴。例如:

#Test url 
test.url=http://test.url.com 

#Production URL 
prod.url=http://prod.url.com 

我定義了一個名爲每個環境中的「ENTORN」(-D參數調用JVM在應用服務器的啓動腳本)的系統性能。此屬性的值在我的測試環境中爲「測試」,在我的生產環境中爲「prod」。

然後我定義我的「propertyConfigurer」豆:

<bean id="propertyConfigurer" class="es.indra.ccma.config.EnvironmentPropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>classpath:ccma.properties</value> 
     </list> 
    </property> 
</bean> 

的EnvironmentPropertyPlaceholderConfigurer代碼:

package es.indra.ccma.config; 

import java.util.Properties; 

import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer; 

public class EnvironmentPropertyPlaceholderConfigurer extends 
     PropertyPlaceholderConfigurer { 

    private String environment; 
    final private static String ENV_SYSTEM_PROPERTY = "entorn"; 

    public EnvironmentPropertyPlaceholderConfigurer() { 

     environment = System.getProperty(ENV_SYSTEM_PROPERTY); 
     if (environment == null) { 
      //default environment 
      environment = "test"; 
     } 
    } 
    protected String resolvePlaceholder(String placeholder, Properties props) { 

     final String envPlaceholder = environment + "." + placeholder; 
     if (props.containsKey(envPlaceholder)) { 
      return props.getProperty(envPlaceholder); 
     } else { 
      return props.getProperty(placeholder); 
     } 
    } 
} 

如果運行在「測試」環境代碼,並要檢索的價值「url」屬性,propertyConfigurer在屬性文件中查找「test.url」,如果沒有找到「test.url」屬性,它會查找「url」屬性。

這不是我的想法I followed this tutorial來實現這一點。

相關問題