【问题标题】:Spring Boot : Spring always assigns default value to property despite of it being present in .properties fileSpring Boot:Spring 始终为属性分配默认值,尽管它存在于 .properties 文件中
【发布时间】:2015-04-06 19:41:16
【问题描述】:

我正在使用 Spring boot 1.1.8,它使用 Spring 4.0.7。我正在使用 @Value 注释自动装配我的类中的属性。如果属性文件中不存在该属性,我希望有一个默认值,所以我使用“:”来分配默认值。下面是例子:

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

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

谁能指导我在这里做错了什么?

谢谢

【问题讨论】:

  • 我已经测试过了,一切正常。如果缺少属性,则采用默认值 (false)。
  • 它应该可以工作。为什么你的字段用 true 初始化?!您可以添加执行器并查看 /env 端点以仔细检查配置是否已按预期应用?
  • 好吧,在其中一个依赖项的深处,“ignoreUnresolvablePlaceholders”参数设置为 true。因此,spring 总是使用默认值并且从不查看 application.properties 文件。设法通过注释掉该块来解决它。谢谢。
  • @DarshanMehta,它如何在应用程序属性中设置此属性?
  • 我的意思是如何在 application.propertes 中将 ignoreUnresolvablePlaceholders 设置为 false。

标签: java spring spring-boot spring-annotations


【解决方案1】:

我们被以下具有完全相同症状的 Spring bug 咬伤:

[SPR-9989] Using multiple PropertyPlaceholderConfigurer breaks @Value default value behavior

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

查看它,每个定义的 PropertyPlaceholderConfigurer 在内部解析了预期的属性,但 Spring 无法确定要使用它们中的哪一个来将值注入 @Value 带注释的字段/参数。

【讨论】:

    【解决方案2】:

    您可以执行以下操作之一来克服此问题:

    1. 在配置器中使用自定义 valueSeparator

    <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,available here

    【讨论】:

      【解决方案3】:

      正如@Ophir Radnitz 所说,这是一个 Spring 错误,当 ApplicationContext 中存在多个 PropertyPlaceholderConfigurer 时会发生。

      作为一种解决方法,您可以通过以下方式获得所需的行为:

      (...)
      
      @Autowired
      private Environment environment;
      
      (...)
      
      private Boolean shouldExportData()
      {        
          return environment.getProperty( "custom.data.export", Boolean.class, Boolean.FALSE );
      }
      

      【讨论】:

        【解决方案4】:

        发生这种情况,取决于参数的类型

        当为String 参数设置默认值时,您的示例代码作为默认值 (@Value("${custom.string:test}")) 可以正常工作,对于其他类型(如您的问题中的boolean),默认值应写入这样:

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

        同样,对于Integers

        @Value("${custom.integer:#{20}}")
        

        祝你好运。

        【讨论】:

          猜你喜欢
          • 2020-10-06
          • 1970-01-01
          • 2022-01-15
          • 2012-10-09
          • 2011-09-16
          • 1970-01-01
          • 2012-07-29
          • 2021-05-25
          • 1970-01-01
          相关资源
          最近更新 更多