我在Spring Boot从点分隔键创建嵌套映射时遇到问题。这本质上与此处描述的问题相同,但建议的解决方案对我不起作用。我正在使用 Spring Boot 1.5.3.RELEASE,以防万一。我的应用程序.yml文件包含以下内容:
props:
webdriver.chrome.driver: chromedriver
我的配置类:
@Configuration
@EnableConfigurationProperties
public class SpringConfig {
private Map<String, String> props = new HashMap<>();
@ConfigurationProperties(prefix = "props")
public void setProps(Map<String, String> props) {
this.props = props;
}
@ConfigurationProperties(prefix = "props")
@Bean(destroyMethod="", name = "props")
public Map<String, String> getProps() {
return props;
}
}
不幸的是,在 Spring Boot 处理 YAML 文件后,点分隔键被拆分为子映射。callig getProps(( 并将结果打印到 System.out 的结果如下所示:
{webdriver={chrome={driver=chromedriver}}}
我尝试将道具字段的类型更改为Properties
、Map<String, Object>
等,但似乎没有任何区别。我还没有找到任何方法来操纵解析行为来完成我想要的。任何帮助都非常感谢。我花了很多时间在这上面,如果我进一步查看代码,我会失明。
尝试使用 YamlMapFactoryBean
这会将 YAML 加载为 MAP。
@Bean
public YamlMapFactoryBean yamlFactory() {
YamlMapFactoryBean factory = new YamlMapFactoryBean();
factory.setResources(resource());
return factory;
}
public Resource resource() {
return new ClassPathResource("application.yml");
}
public Map<String, String> getProps() {
props = yamlFactory().getObject();
return props;
}
输出看起来
props{webdriver.chrome.driver=chromedriver}
经过多次实验,这似乎有效:
@Configuration
@EnableAutoConfiguration
@EnableConfigurationProperties
@ConfigurationProperties
public class SpringConfig {
private Properties info = new Properties();
public Properties getProps() {
return info;
}
}
}
但是我必须在 YAML 条目周围加上单引号,否则 Spring Boot 会使该属性嵌套:
props:
'webdriver.chrome.driver': chromedriver
'foo.bar.baz': foobarbaz
我注意到了几件事。属性(在本例中为 getProps(((的 getter 必须声明为公共的,并且它必须与您尝试在 YAML 中绑定的属性键匹配。也就是说,由于键是"props",getter必须称为getProps((。我想这是合乎逻辑的,并记录在某处,但这不知何故让我溜走了。我认为通过在@ConfigurationProperties
注释上使用前缀="foobar",情况并非如此,但似乎是这样。我想我应该RTFM ;-(