当前位置: 首页 > 知识库问答 >
问题:

Spring Boot:Spring总是将默认值分配给属性,尽管它存在于。属性文件

公孙胡媚
2023-03-14

我正在使用Spring boot 1.1.8,它使用Spring 4.0.7。我正在用@Value注释自动连接类中的属性。如果属性文件中没有该属性,我希望有一个默认值,因此,我使用“:”来指定默认值。下面是一个例子:

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

如果属性文件中不存在属性,则应将该变量赋值为false。但是,如果文件中存在属性,则它也会指定默认值并忽略属性值。例如,如果我定义了如上所述的属性,并且应用程序属性文件有如下内容自定义。数据export=true那么,exportData的值仍然是false,而理想情况下应该是true。

有人能告诉我我做错了什么吗?

谢啦

共有3个答案

易成双
2023-03-14

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

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

(...)

@Autowired
private Environment environment;

(...)

private Boolean shouldExportData()
{        
    return environment.getProperty( "custom.data.export", Boolean.class, Boolean.FALSE );
}
吕和风
2023-03-14

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

  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>
詹正浩
2023-03-14

我们被下面的Spring bug咬了,症状完全一样:

[SPR-9989]使用多个PropertyPlaceHolderConfigure会破坏@Value默认值行为

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

查看一下,每个定义的属性PlaceHolderConfigure都按照预期在内部解析了属性,但Spring无法确定使用哪一个属性来向@value注释字段/参数中注入值。

 类似资料:
  • 20.1 属性默认值 Spring Boot支持的一些库使用缓存来提高性能。例如,模板引擎会缓存已编译的模板,以避免重复解析模板文件。此外,Spring MVC可以在服务静态资源时将HTTP缓存的头部添加到响应中。 虽然缓存功能对生产环境非常有益,但在开发过程中可能会产生反作用,使您无法看到程序中刚刚做出的更改。由于这个原因,spring-boot-devtools默认会禁用那些缓存选项。 缓存选

  • 本文向大家介绍C#属性的默认值,包括了C#属性的默认值的使用技巧和注意事项,需要的朋友参考一下 示例 可以使用初始化程序(C#6)设置默认值 如果它是只读的,则可以返回如下值:            

  • 我只是想知道有没有什么方法可以为log4j中的属性替换提供默认值呢? 我想在Java系统属性中传递文件路径,然后与“${env:MySystemProperty}”一起使用。但如果开发人员忘记设置此属性怎么办?那么我希望在log4j2.xml中定义一些有意义的默认值。 你知道如何实现这个功能吗? 编辑: 环境替换对我不起作用: standalone.conf log4j2.xml 我可以在wild

  • 我在spring-boot项目中有一个properties类。 现在,我想将的application.properties文件中的其他属性设置默认值。与下面的示例使用@value所做的类似

  • 问题内容: A类提供一个字符串值。类B在其内部具有两个A类型的成员,并提供一个计算属性“ v”来选择其中之一。 这段代码很简单,可以正常工作。由于A和B都具有成员“值”,因此我将其设为这样的协议: 如果我更改以下代码 至 它再次起作用! 这是Swift的错误,还是协议属性的特殊之处? 问题答案: 您必须将协议定义为协议: 然后 编译并按预期方式工作(即,将新值分配给if 所引用的对象,否则分配给否

  • 问题内容: 是否可以使用默认值覆盖display属性?例如,如果我以一种样式将其设置为none,而我想以其默认值以其他方式覆盖它。 还是找出该元素的默认值然后将其设置为默认值的唯一方法?不想知道元素通常是block,inline还是任何一个… 问题答案: 浏览器的默认样式在其用户代理样式表中定义,您可以在此处找到其来源。不幸的是,级联和继承级别3规范似乎并未提出一种将样式属性重置为其浏览器默认值的