關於一次“required a single bean, but 2 were found”的錯誤排查

我的項目剛開始做沒多久,原本一切都是正常的,最近加多了一個TreeDao,然後啓動的時候就報了以下錯誤:

Field baseMapper in com.baomidou.mybatisplus.extension.service.impl.ServiceImpl required a single bean, but 2 were found:

按照提示消息,我們可以大概知道它是說 ServiceImpl只能有一個bean,但是我這裏出現了兩個。這個是來源於MyBatisPlus的一個類,理論上是不會有什麼問題的,那麼來排查一下我自己的項目。

首先我的兩個Dao都是沒寫任何東西的,還只是一個空的架子

那麼既然說到是ServiceImpl的問題,那麼再給大家看看,爲了方便拓展,我是使用了一個BaseServiceImpl來繼承它的,也就是說,如果出現問題,那麼就是後面的子類裏面出的問題了。

我是加入了Tree的相關文件後出的問題,在這之前,項目裏面只有Login和User的相關文件,都是能夠和諧共存

現在看看之前的兩個是怎麼寫的

關於TreeServiceImpl是後面加上去的,寫法是這樣

那麼細心的朋友應該已經能發現,Login的寫法比較短,少了<... Dao, Bean> 這部分,但似乎在之前並沒有什麼影響。

然後我看了之前寫的LoginDao,發現是沒有像TreeDao那樣有繼承的,那現在我們也加上去試試。

好傢伙,現在變成3個了

Field baseMapper in com.baomidou.mybatisplus.extension.service.impl.ServiceImpl required a single bean, but 3 were found:

既然如此,把Impl的也一起改了

正常啓動了!

好的,現在我們以現象推導原理,以下是我的個人見解,不一定準確,如有錯誤請大家指正。

其實在下方的提示前,也有一段提示是這樣的(原本是一整句話,我做了換行):

Exception encountered during context initialization - cancelling refresh attempt: 
org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'loginController': 
Injection of resource dependencies failed; 
nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'loginService': 
Unsatisfied dependency expressed through field 'baseMapper'; 
nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: 
No qualifying bean of type 'com.baomidou.mybatisplus.core.mapper.BaseMapper<?>' available: 
expected single matching bean but found 3: loginDao,treeDao,userDao

我們可以直接理解倒數兩行:對於BaseMapper,沒有確切的類型一一對應,而其中有三個Dao。

這個錯誤看起來和後面的那句ServiceImpl的提示沒什麼關聯

Field baseMapper in com.baomidou.mybatisplus.extension.service.impl.ServiceImpl required a single bean, but 3 were found:

我們再看看ServiceImpl的源代碼,再結合實際情況瞭解,就可以知道

問題就出在ServiceImpl<M extends BaseMapper<T>, T> ,我們沒有在Login裏面指定類型的原因。

坑爹的地方在於,這個在編譯時是不會報錯的,連報錯都要看兩個地方,不然也是一頭霧水(反正我是折騰了三天)。

 

至於爲什麼在一開始的Login和User那樣的方式是可以正常運行的呢?就留給大家思考了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章