Spring属性占位符不起作用

时间:2013-05-10 11:27:51

标签: java spring maven tomcat properties

我在stackoverflow.com上看过类似的问题,但没有一个解决方案对我有帮助。 我使用的以下配置(maven项目结构): 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}的值,我想导入相应的数据源配置文件。

当我使用mvn clean install tomcat7:run命令运行嵌入式tomcat7时,我收到错误:

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文件存在。

我正在使用IntelliJ IDEA,在编辑器中我可以点击<import resource="classpath:/spring/db/${mode}-datasource-config.xml"/>中的“$ {mode}”并在属性文件中查看其值。编辑器本身也会将${mode}更改为灰色dev,表示它可以识别属性值。在编辑器中,我看到:<import resource="classpath:/spring/db/dev-datasource-config.xml"/>

为什么我会收到错误以及如何解决错误?

2 个答案:

答案 0 :(得分:12)

导入中的属性占位符仅针对环境变量或系统属性进行解析。

从版本3.1开始,您可以使用ApplicationContextInitializerPropertySources添加到可解决问题的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
            }
        }
    } 

答案 1 :(得分:2)

此属性文件格式是否有效?我认为您应该使用app.properties的以下内容:

#possible values: dev test prod
mode=dev