开发的时候出现了这种错误
nested exception is java .lang.IllegalArgumentException: Could not resolve placeholder 'alipay.appId' in string value
"${alipay.appId}"
大意是Spring不能处理第二个属性文件中的配置信息,因为Spring不允许定义多个PropertyPlaceholderConfigurer或context:property-placeholder。
Spring用反射扫描的发现机制,在探测到Spring容器中有一个org.springframework.beans.factory.config.PropertyPlaceholderConfigurer的
Bean就会停止对剩余PropertyPlaceholderConfigurer的扫描(Spring 3.1已经使用PropertySourcesPlaceholderConfigurer替代 PropertyPlaceholderConfigurer了)。
换句话说,即Spring容器仅允许最多定义一个PropertyPlaceholderConfigurer(或context:property-placeholder),其余的会被Spring忽略掉(其实Spring如果提供一个警告就好了)。
通配符解决、逗号分隔
<context:property-placeholder location="classpath:conf/*.properties"/>
或者使用
<context:property-placeholder location="classpath:conf/db.properties,conf/alipay.properties"/>
使用多个<context:property-placeholder> 分开定义,注意要加上 ignore-unresolvable 属性
<context:property-placeholder location="classpath:conf/db.properties" ignore-unresolvable="true"/> <context:property-placeholder location="classpath:conf/alipay.properties" ignore-unresolvable="true"/>
在每个PropertySourcesPlaceholderConfigurer配置中添加 <property name="ignoreUnresolvablePlaceholders"
value="true"/> 或者在每个context:property-placeholder中都加上ignore-unresolvable="true" 因为在你使用@Value("${xx}")
或在xml中使用${xx}获取属性时,Spring会在第一个读取到的属性文件中去找,如果没有就直接抛出异常,而不会继续去第二个属性文件中找
<bean id="propertyConfigurer" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:db.properties</value> <value>classpath:alipay.properties</value> </list> </property>
最后更新于 2019-09-18 19:46:40 并被添加「java springMVC」标签,已有 1 位童鞋阅读过。