踩坑記2018-7-30B:SpringCloud下mybatis DAO例項化失敗
Field baseDAO in per.wilson.distributed.dao.service.BaseServiceImpl required a bean of type 'per.wilson.distributed.dao.BaseDAO' that could not be found.
required a bean of type xxxx,初眼看是一個很普通的錯誤,一般來說都是DAO掃描配置錯誤,但出現在整合中則顯得耐人尋味了。本人出現該錯誤的整合環境:spring-cloud,mybatis-plus,我想也只能解決該環境下的bean not be found問題。
通過依賴排錯確認了是由於spring-cloud依賴的匯入導致了Bean的生成亂序。個人原來用的spring與mybatis的整合掃描類是org.mybatis.spring.mapper.MapperScannerConfigurer,去除所有spring-cloud的依賴後service可以找到對應的DAO進行注入,但加回Spring Cloud的依賴後就顯示找不到Bean的錯誤了,原因只有2個:1、mapperScanner沒有進行生成DAO(已確保mapperScanner生成成功);2、Spring的bean初始化亂序。由於無法對不瞭解Spring Cloud的初始化過程,所以先對Scanner進行了解找替代方案。左圖是關於掃描的類:
嘗試了用ClassPathMapperScanner與MapperScan替代MapperScannerConfigurer,結果是MapperScan可以成功生成DAO,原入坑配置如下圖:
@Bean public MapperScannerConfigurer mapperScannerConfigurer(){ MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); mapperScannerConfigurer.setBasePackage("per.wilson.distributed"); return mapperScannerConfigurer; }
出坑配置:
@MapperScan("per.wilson.distributed.dao")
這也反應了註解的配置解析與BBean的配置解析不同