在 Spring Boot 中转义 Yaml 中映射键中的一个点

Escaping a dot in a Map key in Yaml in Spring Boot

我有以下 yml 配置:

foo:
  bar.com:
    a: b
  baz.com:
    a: c

接下来 class Spring 尝试使用键 'bar' 和 'baz' 注入映射,将点视为分隔符:

public class JavaBean {
    private Map<String, AnotherBean> foo;
(...)
}

我尝试引用密钥(即 'bar.com' 或 "bar.com")但无济于事 - 仍然是同样的问题。有解决办法吗?

如果您希望将 yaml 键自动映射到 Java bean 属性,这是不可能的。原因是,Spring 首先将 YAML 转换为属性格式。 请参阅下面 link 的第 24.6.1 节:

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

因此,您的 YAML 已转换为:

foo.bar.com.a=b
foo.baz.com.a=c

以上键被解析为标准属性。

作为解决方法,您可以使用 Spring 的 YamlMapFactoryBean 按原样创建 Yaml 映射。然后,您可以使用该映射自行创建 Java 个 bean。

@Configuration
public class Config {

    private Map<String, Object> foo;

    @Bean
    public Map<String, Object> setup() {
        foo = yamlFactory().getObject();
        System.out.println(foo); //Prints {foo={bar.com={a=b}, baz.com={a=c}}}
        return foo;
    }

    @Bean
    public YamlMapFactoryBean yamlFactory() {
        YamlMapFactoryBean factory = new YamlMapFactoryBean();
        factory.setResources(resource());
        return factory;
    }

    public Resource resource() {
        return new ClassPathResource("a.yaml"); //a.yaml contains your yaml config in question
    }

}

这应该有效:

foo:
  "[bar.com]":
    a: b
  "[baz.com]":
    a: c

灵感来自 Spring Boot Configuration Binding Wiki

对@fivetenwill 的回答稍作修改,对我适用 Spring Boot 1.4。3.RELEASE:

foo:
  "[bar.com]":
    a: b
  "[baz.com]":
    a: c

您需要将方括号放在引号内,否则 YAML 解析器基本上会在它们到达 Spring 之前丢弃它们,并且它们不会进入 属性 名称。