您的位置:首页 > 移动开发

SpringBoot 加载不出来application.yml文件

2018-02-01 22:43 411 查看

摘要

记录一次SpringBoot加载不出来application.yml文件的问题解决过程

问题

配置了application.yml文件,但是映射到properties bean的时候失败

@ConfigurationProperties(
prefix = "com.fs"
)
public class DemoProperties {
private String serviceName;

public DemoProperties() {
}

public String getServiceName() {
return this.serviceName;
}

public void setServiceName(String serviceName) {
this.serviceName = serviceName;
}
}


问题分析

分析1:首先怀疑是application.yml文件没有打包到classpath下,这个是最直接的原因,使用的是maven 构建工具

在target 目录下面生成的war中看到了这个文件,排除了这个原因

分析2: DemoProperties文件配置不对

检查发现,@ConfigurationProperties 注解有,setter,getter方法有。不放心debug了一下



发现propertySource中没有application.yml文件的值,一个正常的application.yml文件加载情况应该是这样的



分析3:

这时候根据常识已经找不出问题了,只能看源码了

这篇文章已经写过时序分析了,就不赘述了

http://blog.csdn.net/liaokailin/article/details/48878447

根据时序图可以大致猜测问题发生在load阶段,即加载properties文件阶段。PropertySourceLoader接口中load方法实际读取properties文件。这个接口有两个实现PropertiesPropertySourceLoader,解析后缀名为”properties”, “xml”的application配置文件YamlPropertySourceLoader解析后缀名为”yml”, “yaml”的application配置文件

看下YamlPropertySourceLoader的实现

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

return null;
}


我的天,一眼看出来可能会有问题,判断org.yaml.snakeyaml.Yaml类是否存在,否则返回null

解决

pom文件中加上snakeyaml依赖

<dependency>

<groupId>org.yaml</groupId>

<artifactId>snakeyaml</artifactId>

<version>${snakeyaml.version}</version>

</dependency>


关注我的公众号NoSQL开发,了解NoSQL技术及web开发技术



参考

http://blog.csdn.net/liaokailin/article/details/48878447
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: