Spring Boot启动报错:Failed to configure a DataSource: ‘url’ attribute is not 本质问题解析
************************** APPLICATION FAILED TO START *************************** Description: Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class Action: Consider the following: If you want an embedded database (H2, HSQL or Derby), please put it on the classpath. If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).
关于这个报错,网上已经说了很多,此处不再赘述,究其根本原因,在此阐述下:
普遍有以下几种解决方式:
1.在没有使用到数据库的前提下,可以注释掉数据库相关依赖,比如,mybatis-spring-boot-starter、spring-boot-starter-jdbc等;
这样做的本质是因为
(1)这些依赖中有配置类DataSourceAutoConfiguration加载的条件依赖类 EmbeddedDatabaseType.class ,查看DataSourceAutoConfiguration源码可知,@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }),当项目中存在DataSource和EmbeddedDatabaseType时,DataSourceAutoConfiguration配置类会被加载,而加载时需要 url、driver class、root、password信息,此时配置文件中又没有配置,所以报错。DataSource是JDK自带的,这个移除不了,EmbeddedDatabaseType是spring-jdbc包下的,移除掉包含spring-jdbc的依赖就可以了。基于这个原因,在pom文件中注释掉mybatis-spring-boot-starter、spring-boot-starter-jdbc等数据库依赖就可以解决问题
2.在没有使用到数据库的前提下,使用exclude移除掉配置数据源的配置类
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class})
注意:有时不仅仅只有默认的DataSourceAutoConfiguration类,Spring Boot扫描的是根路径下所有的spring.factories文件
这种方式的本质是
不让数据库配置类加载,Spring Boot自动配置的流程
(1)扫描根路径下所有的spring.factories文件,并以key-value的方式封装到properties中
(2)只获取key为EnableAutoConfiguration的自动配置类
(3)去重
(4)移除掉不需要加载的类(使用exclude配置的需要移除的配置类)
(5)按条件实例化加载
这种方式就是在第四步的时候移除数据库相关的配置类,不让其加载,也就不需要数据库相关配置,就不会报错了
3.要是使用到了数据库,就直接在配置文件中配置上相关配置就可以了,这个没什么本质说的
出现这种问题,还是需要了解Spring Boot自动配置的原理,需要了解的,可以翻看我之前写的博客。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)