带有密钥 URL 的 Spring Boot YAML 配置不再使用版本 2 正确加载

Posted

技术标签:

【中文标题】带有密钥 URL 的 Spring Boot YAML 配置不再使用版本 2 正确加载【英文标题】:Spring Boot YAML configuration with URL in key no longer loads correctly with version 2 【发布时间】:2018-11-27 08:43:33 【问题描述】:

我正在将我的应用程序从 Spring Boot 1.5 迁移到 2.0,并且 YAML 属性之一不再正确加载。以下配置sn -p:

myapp
  serviceUrls:
    'https://example.org/test': 'https://test.example.org/Endpoint'

映射到这个配置类:

@ConfigurationProperties(prefix = "myapp", ignoreUnknownFields = false)
public final class MyAppProperties 
  private Map<String, String> serviceUrls = new HashMap<>();
  //[...]

在 Spring Boot 1.5 中,它加载为带有 https://example.org/test -> https://test.example.org/Endpoint 的地图; 但在 Spring Boot 2.0 中,冒号和斜杠从映射键 httpsexample.orgtest -> https://test.example.org/Endpoint 中消失。

我在migration guide 中找不到任何提及。 Spring Boot 2 中的 YAML 解析是否发生了变化?有没有更好的方法来编写以 URL 作为键的 YAML 映射?

【问题讨论】:

你试过双引号或反斜杠吗? YAML 语法有时令人惊讶。 @KonstantinPelepelin 是的,我都试过了,但我的钥匙仍然损坏。更奇怪的是,提供给org.yaml.snakeyaml.Yaml#load 的相同字符串确实产生了预期的结果...... 【参考方案1】:

我应该检查 GitHub 问题...有人报告了 a similar problem。解决方案是使用“括号语法”,不幸的是barely documented,将键包裹在括号内:

myapp
  serviceUrls:
    '[https://example.org/test]': 'https://test.example.org/Endpoint'

【讨论】:

以上是关于带有密钥 URL 的 Spring Boot YAML 配置不再使用版本 2 正确加载的主要内容,如果未能解决你的问题,请参考以下文章

找不到spring-boot可执行war密钥库

Spring Boot - 如何通过带有查询参数的 url 发送 POST 请求并将响应存储在方法中?

带有斜线的 Spring Boot Path 变量问题

测试期间的Spring Boot JPA事务 - 不会在插入时抛出密钥违例异常

带有 Kotlin 的 Spring Boot - @Value 注释未按预期工作

Spring Boot Jersey 和监控 URL