如何防止 Spring Boot 解析带点的 YAML 键

Posted

技术标签:

【中文标题】如何防止 Spring Boot 解析带点的 YAML 键【英文标题】:How to prevent Spring Boot from parsing YAML keys with dots 【发布时间】:2014-06-14 13:42:56 【问题描述】:

我有一个带有属性映射的 YAML 配置文件:

properties:
  a.b.c: 1

Boot 会将其解析为:

a:b:c:1

但是,我想要的是:

'a.b.c': 1

有没有办法让它进入“通过”键模式?引用密钥似乎没有帮助。


更新

下面的实际示例。

Java

import static com.google.common.collect.Maps.newLinkedHashMap;

import java.util.Map;
import javax.annotation.PostConstruct;

import lombok.Data;
import lombok.val;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Data
@Configuration
@ConfigurationProperties("hadoop")
public class HadoopProperties 

   private Map<Object, Object> properties = newLinkedHashMap();


YAML

application.yml:

hadoop:
   properties:
      fs.defaultFS: hdfs://localhost:8020
      mapred.job.tracker: localhost:8021

结果

在结果对象上调用toString()

HadoopProperties(properties=fs=defaultFS=hdfs://localhost:8020, mapred=job=tracker=localhost:8021)

【问题讨论】:

我不确定您在哪里看到 a:b:c:1。 Spring Boot 中 YAML 的正常使用会将其扁平化为 Properties,因此它只会是一层深度。你能显示一些代码吗? @DaveSyer 更新以添加实际代码示例 我明白了。这是因为您绑定到一个非常通用的对象,所以 Spring Boot 认为您的句点分隔符是映射键取消引用。如果绑定到Map&lt;String,String&gt;Properties 会发生什么? @DaveSyer 似乎与Map&lt;String, Object&gt; 一起工作,但不是Properties。谢谢指点! 我看到了同样的问题,但是我已经有了 Map 并且仍然有问题。 【参考方案1】:

你可以像下面这样使用

hadoop:
   properties:
      "[fs.defaultFS]" : hdfs://localhost:8020
      "[mapred.job.tracker]": localhost:8021

参考 - link

【讨论】:

【参考方案2】:

我明白了。这是因为您绑定到一个非常通用的对象,所以 Spring Boot 认为您的句点分隔符是映射键取消引用。如果绑定到 Map 或 Properties 会发生什么?

【讨论】:

以上是关于如何防止 Spring Boot 解析带点的 YAML 键的主要内容,如果未能解决你的问题,请参考以下文章

带点的哈希表键

windows 如何不显示带点的文件名文件夹?

NumberField 或如何使 TextField 输入 Double、Float 或其他带点的数字

如何防止spring-web的spring-boot自动配置?

springboot-cache缓存和J2cache二级缓存框架(带点漫画)

如何防止 Spring Boot 守护程序/服务器应用程序立即关闭/关闭?