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

时间:2015-02-06 15:51:58

标签: java spring spring-boot spring-annotations

我正在使用Spring 4.0.7,它使用Spring 4.0.7。我使用@Value注释在我的类中自动装配属性。如果属性文件中没有属性,我想要一个默认值,所以,我使用":"分配默认值。以下是示例:

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

如果属性文件中不存在属性,则应该为变量赋值false。但是,如果文件中存在 if 属性,则它还会分配默认值并忽略属性值。 例如。如果我已经像上面提到的那样定义了属性,并且应用程序属性文件具有类似custom.data.export=true的内容,则exportData的值仍然为false,而它应该为true理想地

有人可以指导我在这里做错了吗?

由于

3 个答案:

答案 0 :(得分:12)

我们被以下Spring bug咬了一下,症状完全相同:

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

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

调查一下,每个定义的PropertyPlaceholderConfigurer内部都按预期解析了属性,但是Spring无法弄清楚要使用哪些属性来为@Value注入一个值注释字段/参数。

答案 1 :(得分:3)

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

  1. 在配置程序中使用自定义valueSeparator
  2. 
    
    <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>
    &#13;
    &#13;
    &#13;

    1. 使用订单属性
    2. 增加相关配置器的首选项

      &#13;
      &#13;
      <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?
      &#13;
      &#13;
      &#13;

      我在这个问题上做了一些RnD available here

答案 2 :(得分:0)

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

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

<binding protocol="http" bindingInformation="*:5000:*" />