转载

因maven包依赖问题导致项目启动时扫描到多个SqlSessionFactory从而报错的问题排查

背景

A项目之前一直都是好好的,但是某天下午启动的时候报错,报错见下,报错原因是

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.apache.ibatis.session.SqlSessionFactory' available: more than one 'primary' bean found among candidates。 

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionTemplate' defined in class path resource /[tk/mybatis/mapper/autoconfigure/MapperAutoConfiguration.class/]: Unsatisfied dependency expressed through method 'sqlSessionTemplate' parameter 0; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.apache.ibatis.session.SqlSessionFactory' available: more than one 'primary' bean found among candidates: /[aSqlSessionFactory, bSqlSessionFactory/]
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:732)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:474)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1256)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1105)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:503)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:760)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:869)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)

定位问题

初步定位这个问题的时候眼睛一直盯着more than one 'primary' bean found among candidates: [aSqlSessionFactory, bSqlSessionFactory],然后去看了一下A项目中的mybatis配置,发现都是正常的,这里一直也没有人改动过。

所以项目启动的时候为什么会扫出来bSqlSessionFactory呢?

我尝试把代码切换到master分支上,发现又是可以正常启动的,所以可以肯定应该是当前分支哪里出现了问题,然后和master分支的代码进行了对比,没有做什么改动。。。

但是项目及依赖的版本号是不同的!!!

当前分支使用的是SNAPSHOT的版本号,然后想到了 bSqlSessionFactory是配置在B项目中的 ,难道是包依赖出现了问题?

A项目依赖B项目的facade包,拉下来最新的B项目的代码,发现最近一次有人对B项目的facade的依赖进行了调整,新增了一个对B项目的dao包的依赖,这样启动A项目启动的时候就会把B项目的mybatis配置也扫描进来,从而发现了两个sqlSessionFactory导致了NoUniqueBeanDefinitionException。

然后找到了相关人员确定了一下后发现是误加上去的,最后把B项目的facade中依赖B自身的dao包这个依赖关系给去掉后就可以正常启动a项目了。

原文  https://segmentfault.com/a/1190000022622743
正文到此结束
Loading...