解決springboot報錯找不到自動註入的service問題
springboot報錯找不到自動註入的service
找瞭不少資料,最後發現是每個service接口(雖然已經使用瞭@service註解)的實現類都需要加上@service註解。
如果是使用junit生成的測試類,發現無法自動註入服務的話
在test啟動類前加上
@RunWith(SpringRunner.class) @SpringBootTest @ComponentScan("com.XXX.service")
這是因為test包和啟動類不在同一個包或子包下,無法自動註入
Springboot Service不被識別
根據以往經驗,在Mapper接口沒有添加註解的情況下,Service中自動註入的Mapper都會報紅,這次沒有報紅就知道會出錯,然後測試的時候果不其然報錯瞭。
之所以沒有報紅是因為service類沒有被識別,就是@Service沒有被掃描,所以應該是掃描路徑出瞭問題。
具體原因
在Springboot的啟動類上添加@ComponentScan
@SpringbootApplication是一個復合註解,它中包含瞭:@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan這三個註解。
@ComponentScan是組件掃描註解,它默認掃描的是當前包及以下用來掃描@Controller @Service @Repository這類被標記的類。
錯誤原因:
我的分佈式項目中,路徑如下:
xxx.xxx.modle
xxx.xxx.mapper
xxx.xxx.service
xxx.xxx.web
啟動類在web目錄下,因此@ComponentScan默認掃描路徑是xxx.xxx.web
因為web與modle、mapper、service在同一級別下所以無法掃描到@Service註解。
解決方法
方法一
將啟動類移動到上一級目錄。
方法二
自己定義掃描路徑,寫法如下:
//註解寫法:三種方法效果類似,都是指定掃描路徑 @ComponentScan("xxx.xxx") @ComponentScan(value = "xxx.xxx") @ComponentScan(basePackages = "xxx.xxx")
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- springBoot mybatis 包掃描實例
- SpringBoot 在測試時如何指定包的掃描范圍
- 解決Spring boot 整合Junit遇到的坑
- springboot bean掃描路徑的實現
- 關於@SpringBootApplication與@SpringBootTest的區別及用法