首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Spring BeanCreationException:Autowired 無法找到 CrudDao Bean 排查指南

     編輯:程式設計綜合問答

異常核心


No qualifying bean of type [com.thinkgem.jeesite.common.persistence.CrudDao] 
found for dependency: expected at least 1 bean which qualifies as autowire candidate

原因分析

  1. 掃描路徑缺失:CrudDao 所在包未被 @ComponentScan 或 <context:component-scan> 覆蓋。
  2. Bean 定義缺失:CrudDao 是接口,無實現類標註 @Repository,且無 XML 定義 <bean id="crudDao" class="..."/>。
  3. 多實現類無 @Qualifier:若有多個實現類,@Autowired 無法確定注入哪個,需 @Qualifier("specificDao")。
  4. 版本衝突/類加載器隔離:EAR/WAR 類加載器導致同一接口加載兩次,類型不匹配。

排查步驟

1. 確認實現類存在且被掃描


@Repository
public class CrudDaoImpl extends BaseDao implements CrudDao { ... }

檢查 Spring 配置:
<context:component-scan base-package="com.thinkgem.jeesite.common.persistence"/>

2. 若用 XML 定義 Bean


<bean id="crudDao" class="com.thinkgem.jeesite.common.persistence.CrudDaoImpl"/>

注入處用 @Resource(name="crudDao") 代替 @Autowired(byName 而非 byType)。

3. 檢查父類泛型注入

異常鏈顯示 CrudService.dao 注入失敗,若 CrudService 為泛型基類:


public abstract class CrudService<D extends CrudDao> {
    @Autowired
    protected D dao; // Spring 4+ 支持泛型注入,需確保運行時類型可解析
}

子類必須具體化泛型:
public class AomRapsService extends CrudService<AomRapsDao> { ... }

4. 啟用調試日誌


log4j.logger.org.springframework.beans.factory.support=DEBUG
log4j.logger.org.springframework.beans.factory.annotation=DEBUG

觀察 DefaultListableBeanFactory 輸出的候選 Bean 列表。

最佳實踐

  • DAO 接口 + 實現類標註 @Repository,包路徑納入掃描。
  • Service 注入 DAO 用 @Autowired(單實現)或 @Resource(多實現指定名稱)。
  • 避免在 EAR 多模塊中重複定義相同接口/實現類。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved