如何防止 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<String,String>
或Properties
会发生什么?
@DaveSyer 似乎与Map<String, Object>
一起工作,但不是Properties
。谢谢指点!
我看到了同样的问题,但是我已经有了 Map你可以像下面这样使用
hadoop:
properties:
"[fs.defaultFS]" : hdfs://localhost:8020
"[mapred.job.tracker]": localhost:8021
参考 - link
【讨论】:
【参考方案2】:我明白了。这是因为您绑定到一个非常通用的对象,所以 Spring Boot 认为您的句点分隔符是映射键取消引用。如果绑定到 Map 或 Properties 会发生什么?
【讨论】:
以上是关于如何防止 Spring Boot 解析带点的 YAML 键的主要内容,如果未能解决你的问题,请参考以下文章
NumberField 或如何使 TextField 输入 Double、Float 或其他带点的数字
如何防止spring-web的spring-boot自动配置?