如何在 Spring Boot 的 application.yml 中定义默认空值

Posted

技术标签:

【中文标题】如何在 Spring Boot 的 application.yml 中定义默认空值【英文标题】:How to define default null value in application.yml in Spring Boot 【发布时间】:2016-03-06 14:28:33 【问题描述】:

我正在尝试使用 SpringBoot 版本 1.3.0.RELEASE 在 application.yml 中将默认值定义为空值。目标是能够使用带有ConfigurationProperties 注释的类来引用它

-- application.yml --
test.foo: $test.bar:#null

但它不起作用。

如果test.bar的值没有定义,将test.foo设置为null(默认值)

我的依赖项中已经有了 spring-el。我不想用PropertyPlaceholderConfigurer.setNullValue

它似乎在@Value 中有效,但在application.yml 中无效(请参阅http://farenda.com/spring/spring-inject-null-value/)

这是一个错误,还是 yaml 不是为此而设计的? 我尝试了http://yaml.org/type/null.html 中的所有值,但也没有用

谢谢

【问题讨论】:

我们不会在配置文件中将 SpEL 表达式应用为explained in the documentation 谢谢,如果我明白了,唯一的方法是使用PropertyPlaceholderConfigurer.setNullValue ? 【参考方案1】:

@值

从文档中我们可以看出:

一个常见的用例是使用“#systemProperties.myProp”样式表达式分配默认字段值。

这里其实是三个阶段:

Spring获取注解字符串——AutowiredAnnotationBeanPostProcessor Spring通过注解元数据获取属性值——Environmen Spring解释属性值——ExpressionParser

用户案例

如果我们像您描述的那样在application.yml 中定义test.foo

-- application.yml --
test.foo: $test.bar:#null

然后,我们通过@Value在代码中引用它,它就像你说的那样工作。

@Autowired
public A(@Value("test.foo") Object a) 

但如果我们直接从environment 获取,它将是纯字符串:

env.getProperty("test.foo")

更多

所以,它是否有效取决于您如何使用它。在获得更多信息之前,我无法提供更多帮助。希望关注相关帖子可能会有所帮助。

Spring EL tutorial Spring Boot: customize environment

【讨论】:

您好,谢谢,但没有多大帮助。你需要什么资料?我想在 application.yml 中定义默认的 null 值(开箱即用 spring boot)。 "如果未定义 test.bar 的值,请将 test.foo 设置为 null(默认值)" @khong07 我的意思是你如何推荐你的test.foo。如果您使用@Value 引用它,它可以工作。 我用带有ConfigurationProperties 注释的类来引用它;)【参考方案2】:

尝试使用:

-- application.yml --
test.foo: $test.bar:

【讨论】:

刚试过这个,但是结果是空字符串“”。【参考方案3】:

你需要这样设置:

test:
  foo: $test.bar:'#null'

【讨论】:

请始终将您的答案放在上下文中,而不仅仅是粘贴代码。有关详细信息,请参阅here。 这在我删除单引号时起作用。谢谢

以上是关于如何在 Spring Boot 的 application.yml 中定义默认空值的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 属性配置

Spring Boot核心原理

继Spring-Boot Intro之后,“无法找到合适的主类,请添加'mainClass'属性”

spring boot 知识点

Spring Boot的配置文件

spring boot 基础 多环境配置