SpringBoot使用yaml作为配置文件之坑

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

背景:最近搞新项目,重新搭建一套基于SpringBoot的开发框架。

问题的由来是我在进行一个dao单元测试时,一直失败,报错信息大概是“生成dataSource时maxActive属性不能为0”。基于以往的经验,应该是配置属性没有成功加载。排查由@ConfigurationProperties注解注释的配置属性类时,application.yml中的属性怎么注入不进来。

查看debug日志,发现很奇怪的一行日志

Skipped (empty) config file 'file:/E:/workspace/union-service/union-service-dao/target/test-classes/application.yml' (classpath:/application.yml)

明明不是空的!怀疑文件名不对,确认并重试了几次,仍然不行,只能调试了。

调试到了PropertySourcesLoader这个类

public PropertySource load(Resource resource, String group, String name,
  String profile) throws IOException {
if (isFile(resource)) {
  String sourceName = generatePropertySourceName(name, profile);
  for (PropertySourceLoader loader : this.loaders) {
  if (canLoadFileExtension(loader, resource)) {
    PropertySource specific = loader.load(sourceName, resource,
      profile);
    addPropertySource(group, specific, profile);
    return specific;
  }
  }
}
return null;
}

YamlPropertySourceLoader类的load方法:


@Override
public PropertySource load(String name, Resource resource, String profile)
  throws IOException {
if (ClassUtils.isPresent("org.yaml.snakeyaml.Yaml", null)) {
  Processor processor = new Processor(resource, profile);
  Map source = processor.process();
  if (!source.isEmpty()) {
  return new MapPropertySource(name, source);
  }
}
return null;
}

查找" org.yaml.snakeyaml.Yaml"类,如果不存在,就返回null。我的项目代码修改倒也简单,添加snakeyaml的依赖即可。

但是SpringBoot代码执行到这里,说明已经存在resource文件,因为没有解析yaml的类跳过去,再去找其他适合的配置文件,也说的过去,可是为啥不能打个日志提示一下粗心又顽强的码农们呢?

感觉修改一下比较好,类似这样:

@Override
public PropertySource load(String name, Resource resource, String profile)
  throws IOException {
if (ClassUtils.isPresent("org.yaml.snakeyaml.Yaml", null)) {
  Processor processor = new Processor(resource, profile);
  Map source = processor.process();
  if (!source.isEmpty()) {
  return new MapPropertySource(name, source);
  }
} else {
  logger.warn("Found " + name + " while lacking of snakeyaml");
}
return null;
}

相关issue已在github提交给spring boot。

转载于:https://my.oschina.net/bfleeee/blog/879209

你可能感兴趣的:(SpringBoot使用yaml作为配置文件之坑)