我在stackoverflow.com上读过类似的问题,但是没有一个解决方案对我有帮助。我使用以下配置(Maven项目结构):src/main/resources/properties/app.properties文件
src/main/resources/properties/app.properties
#possible values: dev test prod mode: dev
在Spring配置中:
<context:property-placeholder location="classpath:properties/app.properties"/> <import resource="classpath:/spring/db/${mode}-datasource-config.xml"/>
基于值${mode}我要导入相应的数据源配置文件。
${mode}
当我使用mvn clean install tomcat7:run命令运行嵌入式tomcat7时,出现错误:
mvn clean install tomcat7:run
10, 2013 5:52:29 PM org.apache.catalina.core.StandardContext loadOnStartup SEVERE: Servlet /SpringWebFlow threw load() exception java.lang.IllegalArgumentException: Could not resolve placeholder 'mode' in string value "classpath:/spring/db/${mode}-datasource-config.xml"
该target/classes/properties/app.properties文件存在。
target/classes/properties/app.properties
我正在使用IntelliJ IDEA,在编辑器中,我可以单击“ $ {mode}”,<import resource="classpath:/spring/db/${mode}-datasource- config.xml"/>然后在属性文件中查看其值。编辑器本身也变为${mode}灰色,dev表示可以识别属性值。在编辑器中,我看到:<import resource="classpath:/spring/db/dev-datasource-config.xml"/>
<import resource="classpath:/spring/db/${mode}-datasource- config.xml"/>
dev
<import resource="classpath:/spring/db/dev-datasource-config.xml"/>
有什么想法为什么我得到错误以及如何解决?
导入中的属性占位符仅针对环境变量或系统属性来解析。
由于3.1版本,你可以使用ApplicationContextInitializer添加PropertySources到Enviroment,将解决你的问题。
ApplicationContextInitializer
PropertySources
Enviroment
参见http://blog.springsource.org/2011/02/15/spring-3-1-m1-unified-property- management/
执行配置文件的其他方法是使用配置文件:http : //blog.springsource.org/2011/02/14/spring-3-1-m1-introducing- profile/
编辑
例如:
将初始化程序添加到web.xml
<context-param> <param-name>contextInitializerClasses</param-name> <param-value>foo.bar.AppContextInitializer</param-value> </context-param>
和初始化器:
public class AppContextInitializer implements ApplicationContextInitializer<ConfigurableWebApplicationContext> { @Override public void initialize(ConfigurableWebApplicationContext applicationContext) { Properties props; try { props = PropertiesLoaderUtils.loadAllProperties("/some/path"); PropertiesPropertySource ps = new PropertiesPropertySource("profile", props); applicationContext.getEnvironment().getPropertySources().addFirst(ps); } catch (IOException e) { // handle error } } }