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

时间:2015-12-03 16:18:39

标签: spring spring-boot yaml

我有以下yml配置:

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

使用以下类,Spring尝试使用键'bar'和'baz'注入地图,将点视为分隔符:

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

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

3 个答案:

答案 0 :(得分:45)

@ fivetenwill的回复略有修改,对我来说在Spring Boot 1.4.3上有用.RELEASE:

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

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

答案 1 :(得分:4)

如果要将yaml键自动映射到Java bean属性,则无法执行此操作。原因是,Spring首先将YAML转换为属性格式。 见以下链接的第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 Map。然后,您可以使用该映射来创建自己的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
    }

}

答案 2 :(得分:1)

这应该有效:

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

灵感来自Spring Boot Configuration Binding Wiki