解決springboot報錯找不到自動注入的service問題
springboot報錯找不到自動注入的service
找了不少資料,最后發(fā)現(xiàn)是每個service接口(雖然已經(jīng)使用了@service注解)的實現(xiàn)類都需要加上@service注解。
如果是使用junit生成的測試類,發(fā)現(xiàn)無法自動注入服務(wù)的話
在test啟動類前加上
@RunWith(SpringRunner.class)
@SpringBootTest
@ComponentScan("com.XXX.service")
這是因為test包和啟動類不在同一個包或子包下,無法自動注入
Springboot Service不被識別
根據(jù)以往經(jīng)驗,在Mapper接口沒有添加注解的情況下,Service中自動注入的Mapper都會報紅,這次沒有報紅就知道會出錯,然后測試的時候果不其然報錯了。
之所以沒有報紅是因為service類沒有被識別,就是@Service沒有被掃描,所以應(yīng)該是掃描路徑出了問題。
具體原因
在Springboot的啟動類上添加@ComponentScan
@SpringbootApplication是一個復(fù)合注解,它中包含了:@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan這三個注解。
@ComponentScan是組件掃描注解,它默認(rèn)掃描的是當(dāng)前包及以下用來掃描@Controller @Service @Repository這類被標(biāo)記的類。
錯誤原因:
我的分布式項目中,路徑如下:
xxx.xxx.modle
xxx.xxx.mapper
xxx.xxx.service
xxx.xxx.web
啟動類在web目錄下,因此@ComponentScan默認(rèn)掃描路徑是xxx.xxx.web
因為web與modle、mapper、service在同一級別下所以無法掃描到@Service注解。
解決方法
方法一
將啟動類移動到上一級目錄。
方法二
自己定義掃描路徑,寫法如下:
//注解寫法:三種方法效果類似,都是指定掃描路徑
@ComponentScan("xxx.xxx")
@ComponentScan(value = "xxx.xxx")
@ComponentScan(basePackages = "xxx.xxx")
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解SpringMVC學(xué)習(xí)系列(6) 之 數(shù)據(jù)驗證
這篇文章主要介紹了詳解SpringMVC學(xué)習(xí)系列(6) 之 數(shù)據(jù)驗證 ,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2016-12-12
如何利用 Either 和 Option 進(jìn)行函數(shù)式錯誤處理
這篇文章主要介紹了如何利用 Either 和 Option 進(jìn)行函數(shù)式錯誤處理。在 Java 中,錯誤的處理在傳統(tǒng)上由異常以及創(chuàng)建和傳播異常的語言支持進(jìn)行。但是,如果不存在結(jié)構(gòu)化異常處理又如何呢?,需要的朋友可以參考下2019-06-06
關(guān)于Java中的dozer對象轉(zhuǎn)換問題
Dozer是Java?Bean到Java?Bean映射器,它以遞歸方式將數(shù)據(jù)從一個對象復(fù)制到另一個對象,這篇文章主要介紹了Java中的dozer對象轉(zhuǎn)換的操作方法,需要的朋友可以參考下2022-08-08
springcloud 中 zuul 修改請求參數(shù)信息的方法
這篇文章主要介紹了springcloud 中 zuul 修改請求參數(shù)信息的方法,需要的朋友可以參考下2018-02-02

