Spring-Boot Config:如何在用于填充 Map<String, String> 的 yaml 键中保留空格

Posted

技术标签:

【中文标题】Spring-Boot Config:如何在用于填充 Map<String, String> 的 yaml 键中保留空格【英文标题】:Sping-Boot Config: How to keep whitespace in yaml key being used to populate Map<String, String> 【发布时间】:2020-01-07 18:43:15 【问题描述】:

假设我们有一个配置属性类:

@ConfigurationProperties(prefix = "whitespace.test")
public class WhitespaceTestConfig 

    private Map<String, String> configs;

    public Map<String, String> getConfigs() 
        return configs;
    

    public void setConfigs(Map<String, String> configs) 
        this.configs = configs;
    

我们尝试用一个包含空格的键来配置它:

whitespace.test.configs:
  Key With Whitespace: "I am a value with whitespace in it"

似乎通过spring可以很好地解析这个yaml,而且它显然是有效的yaml。但是,spring (SnakeYaml?) 会删除 Key 字符串中的空格:

KeyWithWhitespace -> I am a value with whitespace in it

一个简单的解决方案是为空格指定一个特殊字符并在应用程序中替换它,但我想知道 spring 是否已经以某种方式处理了这个问题?也许有一种方法可以让 spring(SnakeYaml?)知道我们想要保留它,或者有一种方法可以配置它?

为了完整起见,我尝试使用单引号和双引号以及 \s \b

更新:

经过一些额外的研究,我从 SnakeYaml 存储库中找到了一个示例,这似乎表明我正在寻找的东西应该是可能的:https://bitbucket.org/asomov/snakeyaml/wiki/Documentation#markdown-header-block-mappings

具体是这个例子:

# YAML
base armor class: 0
base damage: [4,4]
plus to-hit: 12
plus to-dam: 16
plus to-ac: 0
# Java
'plus to-hit': 12, 'base damage': [4, 4], 'base armor class': 0, 'plus to-ac': 0, 'plus to-dam': 16

在示例中,空格保留在键中。不幸的是,我不知道实际删除空格的位置。

【问题讨论】:

你试过用双引号把键括起来吗? 是的,那没有用。在答案中,这样做的方法是'[...]' 【参考方案1】:

对于带有特殊字符的映射键,您需要用 '[]' 包围键,以便按指定使用键。

所以,在你的情况下,它会是

whitespace.test.configs:
  '[Key With Whitespace]': "I am a value with whitespace in it"

【讨论】:

文档:github.com/spring-projects/spring-boot/wiki/… 请注意,键周围的单引号很重要。【参考方案2】:

新的绑定器对属性名称更加严格,这意味着您需要将它们括在方括号中。请尝试以下操作:

shiro:
  testMap:
    "[/test1]": test1
    "[/test2]": test2

【讨论】:

以上是关于Spring-Boot Config:如何在用于填充 Map<String, String> 的 yaml 键中保留空格的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring-Boot config 配置 JOOQ 设置?

如何通过使用 JPA + Hibernate 和 Spring-boot 在一个数据库中使用多个模式?

当 logging.config 指向 logfj2 外部配置文件的错误文件位置时,spring-boot 应用程序停止

Spring-Boot配置项

spring-boot 速成 自定义配置

Spring-boot - Docker Compose - 服务就绪