具有YamlPropertiesFactoryBean和Spring Boot的属性占位符

时间:2018-12-07 13:17:55

标签: spring spring-boot

我正在将一个小的“旧版”应用程序迁移到Spring Boot,并遇到与YamlPropertiesFactoryBean结合使用的属性占位符的问题。该应用程序使用Spring XML配置。

我在项目中添加了一个Spring Boot“ main”,如下所示:

@SpringBootApplication
@ImportResource("classpath:spring-config.xml")
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

我已将application.yaml放入/config中。它由Spring boot拾取,我可以通过导入的spring-config.xml中bean声明中的属性替换(${some.prop})访问其中定义的属性。例如

<bean id="myRouteBuilder" class="org.camelSpringBoot.test.MyRouteBuilder">
    <property name="someProp" value="${prop.from.application.yaml}"/>
</bean>
使用org.springframework.beans.factory.config.YamlPropertiesFactoryBean读取其他外部配置文件时,

例外:无法解析org.springframework.core.io.FileSystemResource的构造函数arg中文件位置的属性:

<bean id="yamlProperties" class="org.springframework.beans.factory.config.YamlPropertiesFactoryBean">
    <property name="resources">
        <list>
            <bean class="org.springframework.core.io.FileSystemResource">
                <constructor-arg value="${service.config.loc}" />
            </bean>
        </list>
    </property>
</bean>

收益

  

java.io.FileNotFoundException:$ {service.config.loc}

如果我对外部配置的位置进行硬编码,那么外部YAML文件中使用的属性也将无法解析。

application.yaml:

security:
  keystore:
    loc:      /security/my.keystore

外部配置:

services:
  a:
    ssl:
      secret: ${security.keystore.loc}
  

java.lang.RuntimeException:无法打开密钥库/信任库$ {security.keystore.loc}

请注意,该错误抱怨逐字记录属性。

YamlPropertiesFactoryBean实例在spring-config.xml中声明,就像其他成功使用属性占位符的Bean一样(这意味着属性将被其值替换)。为什么YamlPropertiesFactoryBean

失败

是否可以为外部YAML文档启用占位符解析?

1 个答案:

答案 0 :(得分:0)

我不知道它是否在起作用。属性解析是在BeanDefinition完成后进行的,因此仅适用于Spring Bean,而不适用于yaml文件之类的任意文件。

大多数构建工具(gradle,maven)都包含在构建期间解析那些占位符的功能。可以为您解决方案吗?