我有以下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”),但无济于事 - 仍然是同样的问题。有办法解决这个问题吗?
答案 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)