Spring Boot :Spring始终为属性分配默认值,尽管它存在于.properties文件中

我正在使用Spring boot 1.1.8,它使用Spring 4.0.7。我正在使用@Value注释自动连接类中的属性。如果属性文件中不存在该属性,我希望具有默认值,因此,我使用“:”来分配默认值。下面是示例:

@Value("${custom.data.export:false}")
private boolean exportData = true;

如果属性文件中不存在属性,则应将 false 赋给变量。但是,如果文件中存在属性,则它还会分配默认值并忽略属性值。例如,如果我定义了上面提到的属性,并且应用程序属性文件具有类似的东西,那么的值仍然是假的,而理想情况下它应该是真的。custom.data.export=trueexportData

任何人都可以指导我在这里做错了什么吗?

谢谢


答案 1

我们被以下春季虫子咬伤,症状完全相同:

[SPR-9989]使用多个属性占位符配置器中断@Value默认值行为

基本上,如果 ApplicationContext 中存在多个默认值,则只会解析预定义的默认值,并且不会发生任何覆盖。设置不同的值对此事没有影响,一旦我们删除了多余的值,两个值(真/假)在这方面同样有效。PropertyPlaceholderConfigurerignoreUnresolvablePlaceholdersPropertyPlaceholderConfigurer

仔细观察它,每个定义的属性都按预期在内部解析,但Spring无法弄清楚要使用哪个属性来将值注入带注释的字段/参数。PropertyPlaceholderConfigurer@Value


答案 2

您可以执行下列操作之一来解决此问题:

  1. 在配置器中使用自定义值分离器

<bean id="customConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
     <property name="location" value="file:${catalina.base}/conf/config2.properties"/>
     <property name="ignoreUnresolvablePlaceholders" value="true"/>
     <property name="valueSeparator" value="-defVal-"/>
</bean>
  1. 使用 order 属性增加相关配置器的首选项

<bean id="customConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="file:${catalina.base}/conf/config2.properties"/>
    <property name="ignoreUnresolvablePlaceholders" value="true"/>
    <property name="order" value="-2147483648"/>
</bean?

我已经在这个问题上做了一些RnD,可以在这里找到


推荐