Spring redisとmongodbを同時に統合する際に複数のリソースファイルのロードに遭遇する問題

3622 ワード

この2日間、プラットフォーム内のredisとmongodbの統合に問題が発生しました.
redisとmongodbを個別に統合する場合は正常にプログラムを起動できますが、2つが同時に統合されると次の問題が発生します.
 
 
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"との2つの属性値はtrueである必要があります.
 
 
理由は次のとおりです(記事の最後のリンクから抜粋)
Spring容器は反射走査の発見機構を採用し、Spring容器にorgがあることを検出した.springframework.beans.factory.config.PropertyPlaceholderConfigurerのBeanは、残りのPropertyPlaceholderConfigurerのスキャンを停止します(Spring 3.1 PropertySources PlaceholderConfigurerがPropertyPlaceholderConfigurerの代わりに使用されています).というネーミングスペースベースの構成は、内部ではPropertyPlaceholderConfigurer Beanを作成するだけです.言い換えれば、Springコンテナは最大1つのP r e t y PlaceholderConfigurer()のみを定義することができ、残りは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.iteye.com/topic/1131688