Spring不止一个配置文件和$ {spring.profiles.active}

时间:2014-12-31 06:03:26

标签: spring

在春季4.1.2.RELEASE中,我们在web.xml中有2个活动配置文件

<context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>Production,Customer1</param-value>
</context-param>

我们想要动态加载一些属性文件,如下所示:

<util:properties id="accountPolicy"
        location="classpath:/configs/${spring.profiles.active}/sample.properties" />

${spring.profiles.active}无效,可能是因为有两个配置文件,我尝试了一些查找:${spring.profiles.active[1]}但没有运气!

任何评论

更新:

${spring.profiles.active}似乎是我在下面尝试的逗号分隔列表:

<util:properties id="signConditions"
        location="classpath:/configs/#{ {'${spring.profiles.active}'.split(',')}.get(1) }/sample.properties" />

但是错误似乎会出现XML解析器错误:

    org.springframework.expression.ParseException: 
Expression 'classpath:/configs/#{ {'Production,Customer1'.split('' @ 19: No ending suffix '}' for expression starting at character 19: #{ {'Production,Customer1'.split('

2 个答案:

答案 0 :(得分:1)

我认为更合适的方法是做一些事情:

<beans profile="Production">
    <!-- some other stuff for Production profile -->
</beans>

<beans profile="Customer1">
    <util:properties id="accountPolicy"
        location="classpath:/configs/Customer1/sample.properties" />
    <!-- some other stuff for Customer1 profile -->
</bean>

配置文件应该用作应用程序上下文中配置的配置文件,而不是像替换属性(就像你正在做的那样)


根据我的评论编辑:

您正在寻找的不是Spring配置文件功能的正确用例(至少现在不是这样)。您要做的是在系统属性上拥有属性占位符工作原理。但是,可以通过其他方式激活配置文件。这意味着,您可以打开没有spring.profiles.active系统属性的配置文件。你在做什么并不可靠。

如果传递系统属性没问题,为什么不这样做:

  1. 有一个名为Customer的个人资料,表示会向客户部署涉及帐户政策(以及其他内容)
  2. 传入系统属性,例如,使用key =&#39; customerCode&#39;和价值是客户的标识符。
  3. 通过这样做,您需要做的是

    <beans profile="Production">
        <!-- some other stuff for Production profile -->
    </beans>
    
    <beans profile="Customer">
        <util:properties id="accountPolicy"
            location="classpath:/configs/${customerCode}/sample.properties" />
        <!-- some other stuff for Customer1 profile -->
    </bean>
    

    以及应用程序所需的系统属性应如下所示:-Dspring.profiles.active="Production,Customer" -DcustomerCode=Customer1

    然后您正确使用了个人资料,无需为每个客户复制accountPolicy

答案 1 :(得分:1)

这完成了工作:

<util:properties id="signConditions"
        location="classpath:/configs/#{environment.getActiveProfiles()[1]}/sample.properties" />