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



我在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}}}

我尝试将道具字段的类型更改为PropertiesMap<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 ;-(

最新更新