环境变量未转换为系统属性
Environment variables not converted to system properties
在基于遗留 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>
您正在使用(现已弃用)PropertyPlaceholderConfigurer
,虽然它可以查询系统环境,但缺少将这些属性映射到值的功能。即 HOST_SERVICE_BASE_URL
未映射为 host.service.base.url
.
该支持仅在使用 PropertySourcesPlaceholderConfigurer
时自动注册和查询的 SystemEnvironmentPropertySource
中可用(推荐从 Spring 5.2 开始,但从 3.1 开始可用)。
<bean id="dataConfigPropertyConfigurer"
class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="ignoreResourceNotFound" value="true"/>
<property name="properties" ref="applicationProperties"/>
</bean>
或在 Java 中替换 applicationProperties
bean 和 XML 部分。
@Bean
public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
configurer.setLocations({"/WEB-INF/config/application.properties", /WEB-INF/config/application-dev.properties"});
configurer.setIgnoreResourceNotFound(true);
return configurer;
}
或者,如果您真的坚持使用 XML,请使用 <context:property-placeholder />
标签,它会自动执行此操作。
<context:property-placeholder properties="applicationProperties" ignore-resource-not-found="true" />
或
<context:property-placeholder locations="/WEB-INF/config/application.properties,/WEB-INF/config/application-dev.properties" ignore-resource-not-found="true" />
在基于遗留 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>
您正在使用(现已弃用)PropertyPlaceholderConfigurer
,虽然它可以查询系统环境,但缺少将这些属性映射到值的功能。即 HOST_SERVICE_BASE_URL
未映射为 host.service.base.url
.
该支持仅在使用 PropertySourcesPlaceholderConfigurer
时自动注册和查询的 SystemEnvironmentPropertySource
中可用(推荐从 Spring 5.2 开始,但从 3.1 开始可用)。
<bean id="dataConfigPropertyConfigurer"
class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="ignoreResourceNotFound" value="true"/>
<property name="properties" ref="applicationProperties"/>
</bean>
或在 Java 中替换 applicationProperties
bean 和 XML 部分。
@Bean
public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
configurer.setLocations({"/WEB-INF/config/application.properties", /WEB-INF/config/application-dev.properties"});
configurer.setIgnoreResourceNotFound(true);
return configurer;
}
或者,如果您真的坚持使用 XML,请使用 <context:property-placeholder />
标签,它会自动执行此操作。
<context:property-placeholder properties="applicationProperties" ignore-resource-not-found="true" />
或
<context:property-placeholder locations="/WEB-INF/config/application.properties,/WEB-INF/config/application-dev.properties" ignore-resource-not-found="true" />