环境变量未转换为系统属性

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" />