Dmi*_*rev 15 java spring environment-variables properties-file applicationcontext
我有一个带有PropertyPlaceholderConfigurer的Spring application-context.xml,用于从.properties文件中获取属性值.主文件夹和测试源文件夹具有单独的.properties文件.问题是我需要在.properties文件中使用环境变量.但是,当我按以下方式执行此操作时:
property.name=${env.SYSTEM_PROPERTY}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
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'
Run Code Online (Sandbox Code Playgroud)
而占位符配置器定义为
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:com/example/application.properties"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
任何想法如何使property.name被解释为环境变量(而不是占位符)?
最好的问候,德米特里.
Bru*_*owe 26
我可能完全改变了解决方案:直接注入系统属性,而不是注入引用系统属性的属性
例如
@Value("#{ systemProperties['JAVA_MY_ENV'] }")
private String myVar;
Run Code Online (Sandbox Code Playgroud)
要么
<property name ="myVar" value="#{systemProperties['JAVA_MY_ENV']}"/>
Run Code Online (Sandbox Code Playgroud)
我像这样使用属性占位符配置器
<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" />
Run Code Online (Sandbox Code Playgroud)
您还必须记住使用参数将参数传递给程序
-DJAVA_MY_ENV=xyz
Run Code Online (Sandbox Code Playgroud)
这样,当您运行生产版本时,您可以传递一件事,当您运行另一件事时.
我经常做的事情也是这样的:
<property name="locations">
<list>
<value>classpath:someprops.properties</value>
<value>classpath:someprops-{environment}.properties</value>
</list>
</property>
Run Code Online (Sandbox Code Playgroud)
环境是prod/stage/test/int/ci/local(每个环境1个 - 你现在可能只有2个或3个).您可以将环境变量传递给程序.任何属性应该是相同的,无论它在本地pc/tests上的生产/运行是否都在someprops.properties属性文件中.任何特定于环境/运行方式的文件都将放在更具体的文件中(您应该将它放在someprops.properties文件中以及默认情况下除非被覆盖的机制)
例如在classpath中:someprops.properties
url=www.mysite.com
Run Code Online (Sandbox Code Playgroud)
在classpath中:someprops-local.properties
url=localhost
Run Code Online (Sandbox Code Playgroud)
通过使用这个基本思想,您可以以干净的方式分离测试和程序的正常运行属性.
使用:
<context:property-placeholder location="classpath:env.properties"/>
Run Code Online (Sandbox Code Playgroud)
改变你的:
property.name=${env.SYSTEM_PROPERTY}
Run Code Online (Sandbox Code Playgroud)
至:
property.name=${SYSTEM_PROPERTY}
Run Code Online (Sandbox Code Playgroud)
我正在使用Spring 3.0.4.RELEASE,但我不知道何时引入它.
| 归档时间: |
|
| 查看次数: |
44129 次 |
| 最近记录: |