防止Spring Boot从application.yml中的点分隔键创建嵌套映射?

时间:2017-05-17 03:14:01

标签: spring-boot yaml

我遇到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等,但似乎没有任何区别。 我没有找到任何方法来操纵解析行为来完成我想要的。任何帮助深表感谢。我花了很多时间在这上面,如果我再看一下代码,我就会失明。

2 个答案:

答案 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 ;-)