spring錯誤 :Could not resolve placeholder XXX in string value XXX


spring同時集成redis和mongodb時遇到多個資源文件加載的問題

這兩天平台中集成redis和mongodb遇到一個問題

單獨集成redis和單獨集成mongodb時都可以正常啟動程序,但是當兩個同時集成進去時就會報以下問題

Could not resolve placeholder 'mongo.port' in string value "${mongo.port}

 百思不得解后,經多方搜集查證,終於找到問題原因。

在spring的xml配置文件中當有多個*.properties文件需要加載時。

應該這樣使用使用

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath*:mongodb.properties</value>
            </list>
        </property>
        <property name="ignoreUnresolvablePlaceholders" value="true" /> 
    </bean>

 或者 

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

 但是 ignore-unresolvable="true" 和 <property name="ignoreUnresolvablePlaceholders" value="true" /> 這兩個屬性值必須為true

 

 

原因如下(摘自於文章最后的鏈接)

Spring容器采用反射掃描的發現機制,在探測到Spring容器中有一個org.springframework.beans.factory.config.PropertyPlaceholderConfigurer的Bean就會停止對剩余PropertyPlaceholderConfigurer的掃描(Spring 3.1已經使用PropertySourcesPlaceholderConfigurer替代PropertyPlaceholderConfigurer了)。 

而<context:property-placeholder/>這個基於命名空間的配置,其實內部就是創建一個PropertyPlaceholderConfigurer Bean而已。換句話說,即Spring容器僅允許最多定義一個PropertyPlaceholderConfigurer(或<context:property-placeholder/>),其余的會被Spring忽略掉(其實Spring如果提供一個警告就好了)。 


原文章中提到最后是把所有的資源文件中的資源放在一起加載 

如下:

 

#mongo的資源屬性
mongo.host=192.168.111.230
mongo.port=40000
mongo.connectionsPerHost=8
mongo.threadsAllowedToBlockForConnectionMultiplier=4
mongo.connectTimeout=1500
mongo.maxWaitTime=1500
mongo.autoConnectRetry=true
mongo.socketKeepAlive=true
mongo.socketTimeout=1500
mongo.slaveOk=true
mongo.write.number=1
mongo.write.timeout=0
mongo.write.fsync=true

mongo.dbname=test

#redis的資源屬性
redis.host=192.168.111.225  
redis.port=6379  
redis.pass=  
  
redis.maxIdle=300
redis.maxTotal=600
redis.minIdle=100  

 但是本人認為這樣加載不利於系統的拆分,耦合較高。因此本人推薦還是使用單獨加載每個子系統自己的資源文件最好,如:

#mongo加載資源文件
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath*:mongodb.properties</value>
			</list>
		</property>
		<property name="ignoreUnresolvablePlaceholders" value="true" /> 
	</bean>

#redis加載資源文件
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath*:redis.properties</value>
			</list>
		</property>
		<property name="ignoreUnresolvablePlaceholders" value="true" /> 
	</bean>

 

 只要保證ignoreUnresolvablePlaceholders都為true,或這最后一個加載的為false,之前的都為true即可。

 

參考地址:http://www.myexception.cn/database/1705284.html

http://www.iteye.com/topic/1131688

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM