在spring配置中使用Properties

时间:2011-08-30 09:46:12

标签: java spring

我有一个属性配置,具体取决于我的环境,如下所示:

 <bean id="someConfigurer" 
       class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">  
        <list> 
            <value>classpath:properties/database.${my.env}.properties</value>
            <value>classpath:properties/morestuff.${my.env}.properties</value>
            [..]
        </list>  
    </property>
</bean>

现在我可以在项目中保留不同的属性文件,例如 database.prod.properties database.qual.properties 。如果我用-Dmy.env = foobar启动我的应用程序,这样可以正常工作。

如果没有提供环境会怎样?由于PropertyPlaceholderConfigurer抛出了FileNotFoundException,应用程序将无法启动。我不想保留所有属性文件的副本作为后备。如果未设置系统属性,我想要的是将环境设置为后备。

我尝试使用第二个PropertyPlaceholderConfigurer来解决这个问题:

<bean id="fallbackPropertyConfigurer"  
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">  
        <list>  
            <value>classpath:properties/default-env.properties</value>
        </list>  
    </property>
    <property name="order" value="0" />
    <property name="ignoreUnresolvablePlaceholders" value="true"/>
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
</bean>   

default-env.properties 只包含一个属性:my.env=qual

顺序设置为'0'以确保首先评估此bean。我仍然得到以下异常:

DEBUG  o.s.c.e.PropertySourcesPropertyResolver - Searching for key 'my.env' in [systemProperties]
DEBUG  o.s.c.e.PropertySourcesPropertyResolver - Searching for key 'my.env' in [systemEnvironment]
DEBUG  o.s.c.e.PropertySourcesPropertyResolver - Could not find key 'my.env' in any property source. Returning [null]
DEBUG  o.s.b.f.s.DefaultListableBeanFactory - Finished creating instance of bean 'someConfigurer'
INFO   o.s.b.f.c.PropertyPlaceholderConfigurer - Loading properties file from class path resource [properties/default-env.properties]
INFO   o.s.b.f.c.PropertyPlaceholderConfigurer - Loading properties file from class path resource [properties/database.${my.env}.properties]
INFO   o.s.b.f.s.DefaultListableBeanFactory - Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@435a3a: defining beans [fallbackPropertyConfigurer,someConfigurer,[..],org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0]; root of factory hierarchy
Exception in thread "main" org.springframework.beans.factory.BeanInitializationException: Could not load properties; nested exception is java.io.FileNotFoundException: class path resource [properties/database.${my.env}.properties] cannot be opened because it does not exist
    at org.springframework.beans.factory.config.PropertyResourceConfigurer.postProcessBeanFactory(PropertyResourceConfigurer.java:87)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:681)
    [..]

如果我注释掉PropertyPlaceholderConfigurer以消除错误,我可以在其他bean中使用%{my.env}

有人可以解释这种行为吗?

5 个答案:

答案 0 :(得分:4)

您可以像这样设置默认值(在Spring 3中):

${my.env:qual}

答案 1 :(得分:1)

我建议使用Maven Assembly plugin本地化您的构建,而不是在Spring上下文中摆弄文件名。

答案 2 :(得分:0)

longshoot尝试添加

  

property name =“ignoreUnresolvablePlaceholders”value =“true”/&gt;

到你的第一个豆子

答案 3 :(得分:0)

正如farmor所说,对于第一个bean,属性'ignoreUnresolvablePlaceholders'也应设置为true,如API中所述。

  

默认为“false”:如果占位符失败,将抛出异常   解决。将此标志切换为“true”以保留   占位符字符串as-is在这种情况下,将其留给其他人   占位符配置器来解决它。

答案 4 :(得分:0)

你也可以使用:

<property name="ignoreResourceNotFound" value="true"/>
<property name="ignoreUnresolvablePlaceholders" value="true"/>