背景 :
架构:SpringBoot +Eureka+Zuul+Rabbion+MyBatis+RabbitMq
+Redis+OCR+OSS+Docker+ES
起因:自己新搭的项目在开发系统时候发现部分代码被重复使用但都在自己的项目下配置,于是本着提取公共方法的思想,遂在公共依赖模块下写了一套代码以供调用。
发现
突然有一天北京同事找到我,说项目起不来了,报spring 容器加载不到类。起初我以为是他本地的原因,毕竟我测试环境真真的在跑着项目。然后和他一起排查了一遍发现我的项目确实能跑,但是他本地不行(缓存清了一万遍了)。而且测试环境也可以。注掉我的代码就可以了。
怀疑可能是哪里配置的问题,但是一直没找到原因 。因为大家都有开发任务在身也没深究就先注掉代码开始开发。
排查
今天写到了权限相关的地方,重启网关时发现起不来了
报错重现:
错误倒是挺常见,就mapper层代码没有注册到spring容器中。开始排查
怀疑是mybatis版本的问题,但我的版本也用的父类的版本。
在service层指定mapper包的位置:
报错: 找不到Dao注解和sqlSessionFactory’ or ‘sqlSessionTemplate’?
看了下版本才是mybatis 1.1.1 啊这玩意不用手动指定了。
算了 给配置上看看
现在又报错:
Description:
A component required a bean of type 'javax.sql.DataSource' that could not be found.
- Bean method 'dataSource' not loaded because @ConditionalOnProperty (spring.datasource.jndi-name) did not find property 'jndi-name'
- Bean method 'dataSource' not loaded because @ConditionalOnClass did not find required class 'javax.transaction.TransactionManager'
这。。。数据源又没的了?
看了下数据源明明配置了啊。。
就当即将崩溃的边缘,突然想到为啥别的项目没问题单单网关起不来?
对比配置文件、配置类 发现没啥有关的配置信息啊。
这时网关启动类一行注解差点让我当场去世。。。。
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class, SessionAutoConfiguration.class, SendGridAutoConfiguration.class, FreeMarkerAutoConfiguration.class})
我特么,你可是真省资源啊,网关启动的时候都不加载数据源。。。
难道我的公共大业就要毁于一旦了吗?
以毒攻毒!
那我也配置启动不加载这个bean不就行了吗。
ok 完美解决!