記錄一個今天同事遇到的BUG,以前也遇到過,但是當時沒有記錄,結果浪費了兩個小時時間處理這個BUG。
項目是Spring Boot + MyBatis,項目包結構如下:
代碼報錯爲:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.jy.common.base.BaseMapper
<com.jy.affairs.entity.CompanyManage>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations:
{@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1493)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
... 32 more
說我沒有定義Bean。
No qualifying bean of type
檢查了一遍又一遍的代碼,我定義了啊!沒毛病啊!Pom裏面該引入的都引入了啊!MybatisConfig文件也寫的沒毛病啊!
檢查了一個小時...
後來想起來以前解決過類似的問題,當年那是在做SpringMVC+MyBatis結合的項目的時候,也出過這種詭異的事情。問題出在我的項目目錄結構有問題,
或者說我的MybatisConfig文件的掃描註解路徑有問題。包結構看上面... MyBatisConfig代碼如下:
@Configuration
@MapperScan("com.jy.affairs.mapper.*")
public class MybatisConfig {
@Autowired
private Environment environment;
private RelaxedPropertyResolver propertyResolver;
@Autowired
private DataSource dataSource;
@Autowired
private MybatisProperties properties;
@Autowired
private ResourceLoader resourceLoader = new DefaultResourceLoader();
@Autowired(required = false)
private Interceptor[] interceptors;
@Autowired(required = false)
private DatabaseIdProvider databaseIdProvider;
註解的路徑是:
@MapperScan("com.jy.affairs.mapper.*")
MyBatis的Mapper掃描路徑是指的包名,* 不代表類,代表的是包,而項目中的Mapper類都在com.jy.affairs.mapper包下面,並沒有再向下的層級,所以Mybatis沒有掃描到Mapper類,就報了剛纔的錯誤。
解決辦法:
根據項目情況,是同事在建包結構的時候有問題,所以不改註解中的路徑,而是修改包結構,修改爲:
再次Run,成功!