PropertyPlaceholderConfigurer和.properties文件中的环境变量

我有一个带有PropertyPlaceholderConfigurer的Spring application-context.xml,用于从.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' 

而占位符配置器定义为

    

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

最好的问候,德米特里。

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

例如

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

要么

  

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

    classpath:someprops.properties      

您还必须记住使用参数将参数传递给程序

  -DJAVA_MY_ENV=xyz 

这样,当您运行生产版本时,您可以传递一件事,当您运行另一件事时。

我经常做的事情也是这样的:

    classpath:someprops.properties classpath:someprops-{environment}.properties   

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

例如在classpath中:someprops.properties

 url=www.mysite.com 

在classpath中:someprops-local.properties

 url=localhost 

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

使用:

  

改变你的:

 property.name=${env.SYSTEM_PROPERTY} 

至:

 property.name=${SYSTEM_PROPERTY} 

我正在使用Spring 3.0.4.RELEASE,但我不知道何时引入它。

我使用了benkiefer的方法,但我必须在web.xml中添加一个监听器:

  org.springframework.web.context.ContextLoaderListener