在值标记内部使用Spring Integration SpEl

时间:2014-08-26 19:13:54

标签: java spring properties-file spring-el

我试图在一个类中设置属性文件,该类根据环境(local,dev,ref,qa,prod)扩展PropertyPlaceholderConfigurer

我的文件夹结构如下所示。

properties
   environment.properties
   server-local.properties
   server-ref.properties
   server-prod.properties
   email-local.properties
   email-ref.properties
   email-prod.properties
   cache-local.properties
   cache-ref.properties
   cache-prod.properties

environment.properties有一个属性

environment.stage=local  (or whatever env this is)

My Spring Integration上下文语句如下所示:

<context:property-placeholder location="classpath:properties/*.properties" />

<bean id="propertyPlaceholder" class="com.turner.bvi.BviPropertiesUtil">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="locations">
        <list>
            <value>classpath:properties/environment.properties</value>
            <value>classpath:properties/*-${environment.stage}.properties</value>
        </list>
    </property>

</bean>

我想要做的只是从特定环境阶段加载的属性文件(无论是local,ref,prod ....等)。如何根据environment.stage来加载第二组属性文件?

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您可以使用Spring配置文件,它将是这样的:

<context:property-placeholder location="classpath:properties/*.properties" />
<beans profile="local">

    <bean id="propertyPlaceholder" class="com.turner.bvi.BviPropertiesUtil">
        <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
        <property name="locations">
            <list>
                <value>classpath:properties/environment.properties</value>
                <value>classpath:properties/*-local.properties</value>
            </list>
        </property>
    </bean>
</beans>

<beans profile="dev">
    <bean id="propertyPlaceholder" class="com.turner.bvi.BviPropertiesUtil">
        <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
        <property name="locations">
            <list>
                <value>classpath:properties/environment.properties</value>
                <value>classpath:properties/*-local.properties</value>
            </list>
        </property>
    </bean>
</beans>
...

可以使用spring_profiles_active(或spring_profiles_default)设置环境变量。在Unix中尝试导出SPRING_PROFILES_DEFAULT = local

您可以替代使用JVM参数,例如-Dspring.profiles.active = local

如果您需要按原样维护环境变量,可以按照此处的说明实现自定义ActiveProfilesResolver:Spring Profiles: Simple example of ActiveProfilesResolver?

答案 1 :(得分:0)

谢谢大家的帮助。我能够获取所有建议的片段,并使用&#34; environmentProperties&#34;来提出解决方案。在春天的背景下。

尝试在上下文中使用a的问题是,当我的类试图解析$ {environment.stage}时,它还没有被设置...或者至少这是我从搜索其他内容时收集到的讯息。

如果我的属性文件结构如下所示:

properties
   environment.properties
   server-local.properties
   server-ref.properties
   server-prod.properties
   email-local.properties
   email-ref.properties
   email-prod.properties
   cache-local.properties
   cache-ref.properties
   cache-prod.properties

我能够设置环境属性&#39; env&#39;通过Chef或Docker容器获取正确的值并使用以下代码。

<!-- Register the properties file location -->
<context:property-placeholder location="classpath:properties/*.properties" />

<bean id="propertyPlaceholder" class="com.turner.bvi.BviPropertiesUtil">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="locations">
       <list>
           <value>classpath:properties/environment.properties</value>
           <value>classpath:properties/*-#{systemEnvironment['env']}.properties</value>
       </list>
    </property>
</bean>

我可以把每个属性集放在它自己的目录下并且有

<value>classpath:properties/#{systemEnvironment['env']}/*.properties</value>

再次感谢大家的帮助。