背景:最近搞新项目,重新搭建一套基于SpringBoot的开发框架。
查看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<String, Object> 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<String, Object> 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。