用于搜索引擎抓取
2021-04-12 10:53:30.965 ERROR 25268 — [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter :
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
问题背景
今天在做springcloud的demo时,想着将实体单独分离出来成一个模块,因为可能很多其它的模块都要使用实体,到时候只要依赖这个实体模块就好了。
分离是分离出来了,在生产者一起正常。但是在消费者模块,出现了问题,消费者项目启动的时候就报错,错误信息就是文章开头的那些信息。
着手分析
错误信息大概意思就是:没有数据源。我的消费者项目,只需要用http去调用生产者提供的接口就行了,本身不会去连数据库,所以不用配置数据源按道理也是可以的(经过我测试,如果真按照错误提示去修改,给消费者模块配置数据源,是可以完成功能的,但是需要在消费者模块中多引入依赖,连接池和驱动),但其实消费者根本就没有和数据库打交道,凭什么要我配置数据源?究竟是什么因素,需要在配置数据源呢?
经过我细致的分析排查(哈哈,其实项目本身就没多少东西),是因为我的实体模块中,引入的mybatis-plus的starter,
实体模块中为啥要引入这个依赖呢?因为我实体中需要用mybatis中的一些注解。
用来映射表名和字段名等等,当初引依赖的时候,没多想,照着上个项目就复制过来了。其实问题就在这里,这个mybatis-plus的starter里面,存在一种机制,启动就去找数据源(具体是什么逻辑,目前太菜还不知道),所以就会报错。
解决方案
定位到问题了,那就好解决了,从根本上解决的办法就是:在实体模块中引入依赖时,只引入注解包,不引入其他的东西。
在看博客的时候,我还找到了另外一种解决办法,为啥引入mybatis-plus的starter就需要配置数据源呢?是因为这个类
所以只需要在依赖中将这个类排除,但是在用maven引入依赖的时候,排除也只能排除某个jar包这种很大颗粒的排除,不能做到排除某个类那么细粒度的排除。但是有些大佬有妙计,具体我就细解释了,可以看这篇博客,https://blog.csdn.net/w8y56f/article/details/108185786。如果是springboot项目,还有一种更简单的排除方式:spring启动类上的注解SpringBootApplication有一个属性exclude,可以排除具体类。
上面总共说了两种办法,更细的可以分为三种,不过我个人比较推荐第一种,从根本上解决问题。
为啥有DataSourceAutoConfiguration这个类,就必须配置数据源这个问题,还有待深究。