近日在編寫基於SOA的商城項目,項目由父工程及若干子模塊構成,在編寫過程中,爲了相互協作及維護方便,於是將一些連接地址信息抽取出來單獨放在配置文件中,並且放到了common公用模塊內
在dubbo中兩個xml文件需要各自引入自己的配置於是分別寫了如下引入
<!-- application-dubbo.xml 中 -->
<context:property-placeholder location="classpath:dubbo.properties" />
<!--application-jedis.xml 中-->
<context:property-placeholder location="classpath:jedis.properties" />
於是啓動dubbo服務:Main.main(args)。
控制檯中報錯:
Could not resolve placeholder ‘xxx.xxx’ in string value "${xxx.xxx}
經過調試,證明不是找不到文件,排除properites文件路徑錯誤、拼寫錯誤。
查閱網上資料有如下描述:
一定要記住,不管是在一個Spring文件還是在多個Spring文件被統一load的情況下,直接寫:
<context:property-placeholder location="" />
<context:property-placeholder location="" />
是不允許的,這樣的引入方式會造成衝突。
- 解決衝突:
<context:property-placeholder location="classpath:dubbo.properties" ignore-unresolvable="true" />
添加了ignore-unresolvable="true"屬性,注意,所有引入的地方都要添加,即使一個添加另一個不添加也不行。
- 另外,對於web項目:如果項目中引入了其他jar的配置文件properties,那麼可以在web.xml中配置:
<!-- 上下文參數 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- classpath:表示從當前項目加載 classpath*表示從當前項目及依賴的jar中加載,當所依賴的工具類例如redis又想從中加載配置文件時,可以考慮此用法 -->
<param-value>classpath*:applicationContext-*.xml</param-value>
</context-param>
總結一下,項目中多個spring文件分別引入各自對應的properties或yml配置,應在引入出添加ignore-unresolvable屬性值爲true。
web項目需要引入依賴jar中的配置文件,則在web.xml中contextConfigLocation參數設置爲classpath*:applicationContext-*.xml,classpath後面的星號很重要。