2015-05-19 17 views
2

我已在Spring應用程序中定義了屬性。如何用Tomcat重寫spring property param?

@Configuration 
public class WebappConfiguration { 

    @Value("${ext.storage.path}") 
    private String extDirectoryPath; 

    public String getExtDirectoryPath() { 
     return extDirectoryPath; 
    } 
} 

ext.storage.path屬性的默認值在application.properties文件中定義。

application.properties

ext.storage.path=/home/user/ext/ 

當我部署WAR到Tomcat VM選項-Dext.storage.path=/var/webapp-data/,這個值被成功加載。但是我希望從每個環境的上下文文件中加載更明智的屬性值。

因此,我部署了WAR到Tomcat的ROOT,WAR文件的名稱是ROOT.war,它被分解到ROOT目錄。我在以下內容的路徑{CATALINA_BASE}/Catalina/localhost/ROOT.xml上創建了context文件。

的ROOT.xml

<Context 
     docBase="/opt/webapp-tomcat/webapps/ROOT.war" 
     path="" 
     reloadable="true"> 

     <Parameter name="ext.storage.path" value="file:/var/webapp-data/" override="true"/> 

</Context> 

不幸的是,根據道路的參數是不加載,它已經從application.properties默認值。

編輯: 一個小調查後,我把Parameter到主context.xml文件的Tomcat的和值將被覆蓋。

<Parameter name="ext.storage.path" value="file:/var/webapp-data/" override="true"/> 
+0

試着把它放在JNDI中,而不是一個參數。它應該仍然會查找。您可能想要爲彈簧啓用調試/跟蹤日誌記錄,這樣可以查看加載位置和諮詢位置。 –

回答

1

我知道的最好的技術是將環境特定的東西放到Tomcat的conf/context.xml文件中。

<Environment name="myApp/extStoragePath" type="java.lang.String" value="/var/data/myapp"/> 

這定義了你在你的代碼查找的是這樣一個JNDI變量:

Context initCtx = new InitialContext(); 
Context envCtx = (Context) initCtx.lookup("java:comp/env"); 
String extStoragePath = (String) envCtx.lookup("myApp/extStoragePath"); 

您也可以使用這種技術來加載,如數據庫的數據源等複雜的對象,具有巨大的優勢:

  • 的配置是個人的環境,而不是應用程序
  • 你並不需要使用Tomcat亂啓動腳本
  • 相同的二進制文件將在DEV,UAT和PROD中運行而不需要修改。這大大簡化了構建過程。

另外,Spring提供了一個org.springframework.jndi.JndiObjectFactoryBean,它可以從你的spring配置文件中訪問JNDI。

+0

但我嘗試在context.xml中定義特定的東西,但Tomcat定義了三種等效的方式:*在/ META-INF/context.xml中的單個文件中*在單個文件中(帶有「.xml」擴展名) '$ CATALINA_BASE/conf/[enginename]/[hostname] /'目錄。 *在主「conf/server.xml」中的主機元素內。我知道不需要爲加載值定義另一個代碼。 Tomcat從個別路徑自動初始化值。 – misco

+0

好的,我知道你的建議的好處。這與我使用的方式是一樣的,但是你不寫我相關的解決方案。 – misco

+0

>>「但是我想從每個環境的上下文文件中加載更明智的屬性值。」你能告訴我們爲什麼JNDI不是實現這個目標的好方法嗎? – kiwiron