这两天平台中集成redis和mongodb遇到一个问题java
单独集成redis和单独集成mongodb时均可以正常启动程序,可是当两个同时集成进去时就会报如下问题redis
Could not resolve placeholder 'mongo.port' in string value "${mongo.port}
百思不得解后,经多方搜集查证,终于找到问题缘由。spring
在spring的xml配置文件中当有多个*.properties文件须要加载时。mongodb
应该这样使用使用socket
<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>
或者 spa
<context:property-placeholder location="classpath*:redis.properties" ignore-unresolvable="true" />
可是 ignore-unresolvable="true" 和 <property name="ignoreUnresolvablePlaceholders" value="true" /> 这两个属性值必须为truecode
缘由以下(摘自于文章最后的连接)xml
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若是提供一个警告就行了)。 htm
原文章中提到最后是把全部的资源文件中的资源放在一块儿加载
以下:
#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便可。