@MapperScan和@ComponentScan一塊使用導致沖突的解決
@MapperScan和@ComponentScan一塊使用沖突
項目集成瞭knief4j
報錯:
NoSuchBeanDefinitionException: No qualifying bean of type ‘springfox.documentation.schema.TypeNameExtractor’
很明顯是容器缺少必須的bean,啟動不成功
解決方案
方案一
@MapperScan和@ComponentScan一起使用
1.建一個配置類
啟動類不做改變
package com.test.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan("com.test.bean") public class FileNameUtilsConfig { }
方案二
啟動類做改變,使用@MapperScan一塊掃描
@MapperScan(basePackages = {"com.test.mapper","com.test.bean"})
項目中@MapperScan和@Mapper共存之坑XxxMapper that could not be found.
公司項目有個小夥子將項目的日志功能做瞭優化。今天在pom添加依賴,在啟動類上加個註解,然後啟動項目突然報瞭ModuleMapper 找不到。
項目一直是好的,又沒有對這個mapper修改。進入ModuleMapper 中發現上面也是有@Mapper註解的
可是為什麼容器找不到呢,分析一下剛剛修改的才做,引入依賴加註解,問題可能是註解上的問題,註釋掉添加的註解,啟動服務正常運行。罪魁禍首就是這個註解。
點解註解發現配置類上有個@MapperScan掃描註入。發現這夥計需要操作數據庫。而我接收負責的項目用的是傳統的@Mapper註入。
思考:難道在一個項目中@MapperScan和@Mapper不能共存嗎?
嘗試解決
自己創建一個springboot 項目,開始用@Mapper 註入容器 啟動程序。程序正常啟動。
停掉服務,將mapp文件上的@Mapper刪除 ,將文件移動到mapper文件中,在啟動類上添加@MapperScan 掃包註入。正常啟動。
現在測試@MapperScan 和@Mapper 分別在不包中測試一下。現在將UserMapper 放在mapper包中, 將UserTokenMapper 放在mapper2包中並添加@Mapper 啟動測試。
啟動類:
UserMapper :
UserTokenMapper :
啟動項目報錯:
Description:
Field userTokenMapper in com.wyz.yangyang.member.service.impl.MemberServiceImpl required a bean of type ‘com.wyz.yangyang.member.mapper2.UserTokenMapper’ that could not be found.
Action:
Consider defining a bean of type ‘com.wyz.yangyang.member.mapper2.UserTokenMapper’ in your configuration.
Disconnected from the target VM, address: ‘127.0.0.1:56527′, transport: ‘socket’
Process finished with exit code 1
然後我有測試可@MapperScan 掃描的包中不放mapper 文件,mapper2 中mapper文件都添加@Mapper,發現啟動正常。
又測試瞭@MapperScan 和@Mapper 同在一個包中,啟動正常。
在此可以看出 @MapperScan 和@Mapper在不同包中,@Mapper註解失效。
為瞭項目快速開發,為瞭以後更好的兼容,我將項目改為@MapperScan 模式,因為一個註解可以配置多個包路徑。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 基於@MapperScan和@ComponentScan的使用區別
- 詳解Spring系列之@ComponentScan自動掃描組件
- Java之Spring註解開發案例詳解
- springboot啟動掃描不到dao層接口的解決方案
- Spring Dao層@Repository與@Mapper的使用