我遇到Spring Boot从点分隔键创建嵌套映射的问题。它基本上与here描述的问题相同,但解决方案表明这对我不起作用。我正在使用Spring Boot 1.5.3.RELEASE以防万一。我的applications.yml文件包含:
var year = 1988;
var month = 12;
var day = 23;
console.log(new Date(year, month - 1, day));
console.log(new Date(Date.UTC(year, month - 1, day)));
我的配置类:
props:
webdriver.chrome.driver: chromedriver
不幸的是,在Spring Boot处理YAML文件之后,点分隔键被分割成子图。 callig getProps()的结果并将结果打印到System.out,如下所示:
@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;
}
}
我尝试将道具字段的类型更改为{webdriver={chrome={driver=chromedriver}}}
,Properties
等,但似乎没有任何区别。
我没有找到任何方法来操纵解析行为来完成我想要的。任何帮助深表感谢。我花了很多时间在这上面,如果我再看一下代码,我就会失明。
答案 0 :(得分:2)
尝试使用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}
答案 1 :(得分:0)
经过多次试验,这似乎有效:
@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
我发现了一些事情。属性的getter(本例中为getProps())必须声明为public,并且必须匹配您尝试在YAML中绑定的属性键。即因为键是“道具”,所以必须将getter称为getProps()。我认为这是合乎逻辑的,并且记录在某个地方,但这种方式让我感到不知所措。我想通过使用前缀=&#34; foobar&#34;在@ConfigurationProperties
注释中,情况并非如此,但似乎是这样。我想我应该RTFM ;-)