目录
问题展示
首先,此问题出现在springcloud某一个微服务启动时, 弹出的错误如下
很明显可以看出springboot启动时加载不到我们给他配置的数据源,我第一个反应是yml文件配置写错了。下面是这个微服务的yml文件,我今天反复看了好多次也没发现问题
server:
port: 8081
spring:
application:
name: item-service
datasource:
url: jdbc:mysql:///leyou
username: root
password: root
eureka:
client:
service-url:
defaultZone: http://localhost:10086/eureka
instance:
lease-renewal-interval-in-seconds: 5
lease-expiration-duration-in-seconds: 15
mybatis:
type-aliases-package: com.leyou.item.pojo
事实上,我的yml文件并没有问题
问题剖析
原因是启动微服务时,application应用会调用@SpringBootApplication这个注解,这个注解做的其中一件事是自动加载数据源,首先确保yml文件没有写错。以下两种情况时,最可能引起这个错误
- 你的yml文件里有多个数据源,springboot不知道该调用哪个,所以找不到
- 逐层调用数据库时某一层的jar包版本和其他层的maven版本不兼容
很明显我的问题是第二种情况。这里对版本兼容提供一个简单的思路,mysql数据库在本地,项目启动首先要有jdbc的jar包,mysql驱动的jar包,以及对应的以下mabatis,mapper,druid的各种jar包版本。
上图中的版本都没有错误,但是有一个版本我写的和mysql的其他版本不兼容,导致springboot找不到数据源。你想到了还剩哪个版本吗?
解决方案
第一种
对,就是整个springboot工程启动器的jar包版本,这个jar包的版本和其他版本不匹配就没法调用mysql服务。如图,我之前写的版本是2.0.1,当我改成2.0.6之后项目启动成功了
ps:springcloud项目中spring-boot-starter-parent这个jar包一般都是在父工程里的哦
第二种
spingboot默认会自动找数据源,当我们的springboot启动器版本找不到数据源时,我们干脆就不让他自己找,跳过这一步,直接让springboot启动器的上一步找到yml文件中的数据库配置信息,这种方式只需要在这个微服务项目的application.class文件的@SpringBootApplication注解上加一个限制条件即可,不让他自动扫描数据源
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
项目也可以正常启动