属性占位符.属性文件中的配置器和环境变量

我有一个Spring应用程序上下文.xml使用PropertyPlaceholderConfigurer从.properties文件中获取属性值。主文件夹和测试源文件夹具有单独的 .properties 文件。问题是我需要在.properties文件中使用环境变量。但是当我以这种方式这样做时:

property.name=${env.SYSTEM_PROPERTY}

我收到以下错误:

org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'beanName' defined in class path resource [com/example/applicationContext.xml]: Could not resolve placeholder 'env.SYSTEM_PROPERTY'

而占位符配置器定义为

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:com/example/application.properties"/>
</bean>

任何想法 - 如何使 property.name 被解释为环境变量(而不是占位符)?

最好的问候,德米特里。


答案 1

我可能会完全改变解决方案:直接注入系统属性,而不是注入引用系统属性的属性。

例如:

@Value("#{ systemProperties['JAVA_MY_ENV'] }") 
private String myVar;

<property name ="myVar" value="#{systemProperties['JAVA_MY_ENV']}"/>

我使用像这样的属性占位符配置器

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations">
    <list>
        <value>classpath:someprops.properties</value>
    </list>
  </property>
  <property name="ignoreResourceNotFound" value="true" />
  <property name="searchSystemEnvironment" value="true" />
  <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />

您还必须记住使用以下命令将参数传递到程序中

 -DJAVA_MY_ENV=xyz

这样,当您运行生产版本时,您可以传递一件事,而当您运行测试时,则可以通过另一件事。

另外,我经常做的是这样的:

  <property name="locations">
    <list>
      <value>classpath:someprops.properties</value>
      <value>classpath:someprops-{environment}.properties</value>
    </list>
  </property>

其中环境是 prod/stage/test/int/ci/local(每个环境 1 个 - 您现在可能只有 2 个或 3 个)。您可以将环境变量传递给程序。任何应该相同的属性,无论其在本地pc/tests上的生产/运行情况如何,都将位于someprops.properties属性文件中。任何特定于环境/运行方式的都将进入更具体的文件(除非被覆盖的机制,否则应将其放在someprops.properties文件中以及默认值中)

例如,在类路径中:someprops.properties

url=www.mysite.com

在类路径中:someprops-local.properties

url=localhost

通过使用这个基本思想,你可以以干净的方式将测试和程序的正常运行属性分开。


答案 2

用:

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

更改您的:

property.name=${env.SYSTEM_PROPERTY}

自:

property.name=${SYSTEM_PROPERTY}

我正在使用Spring 3.0.4.RELEASE,但我不知道这是什么时候引入的。


推荐