2010-08-04 35 views
93

我們目前正在編寫一個應用程序,該應用程序被拆分爲多個項目/模塊。例如,我們採取以下模塊:在多個項目/模塊中使用多個屬性文件(通過PropertyPlaceholderConfigurer)

  • 對myApp-DAO
  • 對myApp-jabber的

每個模塊都有自己的Spring上下文XML文件。對於DAO模塊,我有一個PropertyPlaceholderConfigurer,它用必要的db連接參數讀取一個屬性文件。在jabber模塊中,我還有一個用於jabber連接屬性的PropertyPlaceHolderConfigurer。

現在主要的應用程序包括myApp-DAO和myApp-jabber。它讀取所有的上下文文件並啓動一個大的Spring上下文。不幸的是,似乎每個上下文只能有一個PropertyPlaceholderConfigurer,因此無論哪個模塊首先被加載,都能夠讀取它的連接參數。另一個拋出一個異常,如「無法解析佔位符'jabber.host'」

我有點理解問題是什麼,但我真的不知道解決方案 - 或對我的最佳做法用例。

我該如何配置每個模塊,以便每個模塊都能夠加載自己的屬性文件?現在我已經將PropertyPlaceHolderConfigurer移出單獨的上下文文件,並將它們合併到主應用程序的上下文中(使用單個PropertyPlaceHolderConfigurer加載所有屬性文件)。這很糟糕,因爲現在每個使用dao模塊的人都必須知道,他們需要在他們的上下文中使用PropertyPlaceHolderConfigurer ..還有dao模塊中的集成測試失敗等。

我很好奇聽到有關解決方案/來自Stackoverflow社區的想法。

+7

+1對詞的用法 「吸」 :-D – 2013-04-10 12:21:45

+0

@PeterWippermann你爲什麼不大膽呢? :D – Nabin 2016-06-21 14:37:40

回答

158

如果確保每個佔位符在所涉及的每個上下文中都忽略了無法解析的密鑰,那麼這兩種方法都可以工作。例如:

<context:property-placeholder 
location="classpath:dao.properties, 
      classpath:services.properties, 
      classpath:user.properties" 
ignore-unresolvable="true"/> 

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="locations"> 
      <list> 
       <value>classpath:dao.properties</value> 
       <value>classpath:services.properties</value> 
       <value>classpath:user.properties</value> 
      </list> 
     </property> 
     <property name="ignoreUnresolvablePlaceholders" value="true"/> 
    </bean> 
+10

這是一個有用的條目,可以幫助您進一步解決這些問題:http://tarlogonjava.blogspot.com/2009/02/tips-regarding-springs.html – 2010-08-04 16:51:45

+1

謝謝! ignore-unresolvable =「true」正是我所需要的,它的確有訣竅! – black666 2010-08-05 09:15:22

+1

如果你在1個標籤中添加所有文件,那麼不要事件需要'ignore-unresolvable =「true」',否則需要。 – 2015-05-08 10:43:58

4

PropertiesPlaceholderConfigurer bean有一個名爲「propertiesArray」的替代屬性。使用此屬性替代「屬性」屬性,並使用屬性引用的<array>進行配置。

8

您可以擁有多個<context:property-placeholder />元素,而不是顯式聲明多個PropertiesPlaceholderConfigurer bean。

+5

請注意侷限性:http://stackoverflow.com/a/1473329/603516 – Vadzim 2013-11-20 19:01:35

+0

我試過使用兩個元素,並且Spring抱怨它無法識別指定的屬性。我必須執行被接受的答案才能發揮作用。 – Mushy 2017-09-04 14:16:24

17

我知道這是一個老問題,但ignore-unresolvable財產不是爲我工作,我不知道爲什麼。

問題是我需要一個外部資源(類似於location="file:${CATALINA_HOME}/conf/db-override.properties"),而ignore-unresolvable="true"在這種情況下不能完成這項工作。

中需要的忽略缺少的外部資源做的是:

ignore-resource-not-found="true" 

萬一別人碰到這一點。

+3

'ignore-unresolvable'和'ignore-resource-not-found'服務於不同的目的。爲了防止當**文件**不存在時發生錯誤,使用'ignore-resource-not-found =「true」'。爲了避免在使用file_中不存在的屬性時出現錯誤,請使用'ignore-unresolvable =「true」'。如果您有多個文件,每個文件都包含部分屬性集,並且每個文件可能存在也可能不存在,則需要同時使用這兩個文件。 – datguy 2014-03-05 18:27:16

0

我試過下面的解決方案,它在我的機器上工作。

<context:property-placeholder location="classpath*:connection.properties" ignore-unresolvable="true" order="1" /> 

<context:property-placeholder location="classpath*:general.properties" order="2"/> 

如果多個元素存在於 Spring上下文,存在應當是 ,隨後幾個最佳做法:

的次序屬性需要指定以固定的順序 這些由Spring處理所有屬性佔位符減去最後一個 一個(最高順序)應該有ignore-unresolvable=」true」以允許 解析機制傳遞給其他人在上下文中沒有 拋出異常

來源:http://www.baeldung.com/2012/02/06/properties-with-spring/

+0

是否需要指定訂單?我試了這個,jvm抱怨。 – Mushy 2017-09-04 14:17:39

相關問題