【发布时间】:2020-08-13 13:46:34
【问题描述】:
在基于传统 Spring 的应用程序(Spring 4.3)上工作时,我有一个奇怪的行为:环境变量没有被 Spring 解析。
例如我有这个环境变量:HOST_SERVICE_BASE_URL,当我在应用程序中使用${host.service.base.url} 引用它时,属性未解析,应用程序在启动过程中失败。
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'host.service.base.url' in value "${host.service.base.url}
我为属性解析定义了这些 bean:
@Bean
public PropertiesFactoryBean applicationProperties( ResourceLoader resourceLoader ) {
PropertiesFactoryBean propertiesFactory = new PropertiesFactoryBean();
propertiesFactory.setLocations( resourceLoader.getResource( "/WEB-INF/config/application.properties" ),
resourceLoader.getResource( "/WEB-INF/config/application-dev.properties" ) );
return propertiesFactory;
}
和
<bean id="dataConfigPropertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreResourceNotFound" value="true"/>
<property name="searchSystemEnvironment" value="true"/>
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
<property name="properties" ref="applicationProperties"/>
</bean>
【问题讨论】:
-
环境变量永远不会转换为系统属性。你真的有一个环境变量或者你有一个系统属性(通过
-D)。另外,为什么 XML 和 Java 配置的混合以及你是否有多个PropertyPlaceholderConfigurer实例并且你正在加载多个配置? -
@M.Deinum 我有环境变量而不是系统属性。与 xml 混合是因为它是一个遗留应用程序,我不想迁移所有配置
-
啊已经看到你的问题了。您应该使用
PropertySourcesPlaceholderConfigurer而不是PropertyPlaceholderConfigurer并加载属性,除非您需要它们,否则应该使用相同的类。 -
是的,加载了多个配置
标签: java spring environment-variables system-properties