首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring : Spring总是将默认值赋值给属性,尽管它存在于.properties文件中。

Spring : Spring总是将默认值赋值给属性,尽管它存在于.properties文件中。
EN

Stack Overflow用户
提问于 2015-02-06 15:51:58
回答 4查看 14.3K关注 0票数 16

我正在使用Spring 1.1.8,它使用Spring4.0.7。我正在使用@Value注释自动处理类中的属性。如果属性文件中没有属性,我希望有一个默认值,所以我使用":“来分配默认值。下面是一个例子:

代码语言:javascript
运行
复制
@Value("${custom.data.export:false}")
private boolean exportData = true;

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

有人能指点我这里做错了什么吗?

谢谢

EN

回答 4

Stack Overflow用户

发布于 2015-10-29 22:53:22

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

[SPR-9989]使用多个PropertyPlaceholderConfigurer中断@Value默认值行为

基本上,如果在PropertyPlaceholderConfigurer中存在一个以上的ApplicationContext,则只会解决预定义的默认值,并且不会发生重写。设置不同的ignoreUnresolvablePlaceholders值对问题没有影响,在删除额外的PropertyPlaceholderConfigurer后,这两个值(真/假)在这方面同样有效。

查看它,每个定义的PropertyPlaceholderConfigurer内部解析了预期的属性,但是Spring无法确定要使用哪些属性来向@Value注释的字段/params注入值。

票数 16
EN

Stack Overflow用户

发布于 2017-02-28 06:21:49

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

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

代码语言:javascript
运行
复制
<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属性增加相关配置程序的首选项

代码语言:javascript
运行
复制
<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,可在这里找到

票数 5
EN

Stack Overflow用户

发布于 2018-06-20 18:18:49

正如@Ophir Radnitz所指出的,这是一个春季bug,当ApplicationContext中有多个ApplicationContext时就会发生这种情况。

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

代码语言:javascript
运行
复制
(...)

@Autowired
private Environment environment;

(...)

private Boolean shouldExportData()
{        
    return environment.getProperty( "custom.data.export", Boolean.class, Boolean.FALSE );
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28369582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档