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

SpringMVC 报错 NoSuchBeanDefinitionException:PubCommonDAO 找不到?三步排查定位 Bean 載入失敗

     編輯:程式設計疑難解答

經典 Spring 錯誤:No bean named 'PubCommonDAO' is defined,堆疊跟蹤指向 LogViewerService.findCodes() → LogViewerController.index()。明明 XML 配了 Bean,為什麼容器找不到?本文給出三步排查法。

錯誤堆疊關鍵路徑

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'PubCommonDAO' is defined
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(...)
    at org.service.LogViewerService.findCodes(LogViewerService.java:20)
    at org.controller.LogViewerController.index(LogViewerController.java:37)

三步排查法

步驟 1:核對 XML Bean 聲明(拼寫、ID、路徑)

<!-- 典型錯誤:id 拼寫不一致 -->
<bean id="pubCommonDAO" class="org.dao.PubCommonDAOImpl" />  <!-- 小寫 p -->
<!-- Java 代碼注入 -->
@Resource(name = "PubCommonDAO")  <!-- 大寫 P -->
private PubCommonDAO pubCommonDAO;
  • 檢查 id/name 大小寫完全匹配。
  • 檢查 class 全限定名正確、無拼寫錯誤。
  • 檢查 XML 是否被 <import resource="..."/> 或 <context:component-scan> 掃描到。

步驟 2:確認 Class 文件編譯產出

  • Maven 專案:target/classes/org/dao/PubCommonDAOImpl.class 是否存在?
  • IDE 編譯:Build → Rebuild Project,清理緩存。
  • 檢查 pom.xml 依賴範圍:<scope>provided</scope> 會導致打包無 Class。

步驟 3:上下文層級與載入順序

  • 父子容器隔離: SpringMVC 典型雙容器結構:
    ContextLoaderListener (父) 載入 Service/Dao/DAO → DispatcherServlet (子) 載入 Controller。
    若 PubCommonDAO 在子容器 XML 配置,Service(父容器)無法引用 → 移至父容器配置文件(如 applicationContext.xml)。
  • 懶加載: <bean lazy-init="true"> 導致首次注入失敗?改為 lazy-init="false"。

快速驗證腳本

// 在 Controller 或測試類注入 ApplicationContext
@Autowired ApplicationContext ctx;

public void debugBeans() {
    String[] names = ctx.getBeanDefinitionNames();
    Arrays.stream(names)
          .filter(n -> n.contains("PubCommonDAO") || n.contains("pubCommonDAO"))
          .forEach(System.out::println);
    
    // 直接嘗試獲取
    try {
        Object bean = ctx.getBean("PubCommonDAO");
        System.out.println("Found: " + bean.getClass());
    } catch (Exception e) {
        System.out.println("Not found: " + e.getMessage());
    }
}

常見誤區對照表

現象真相修正
XML 寫了但報錯XML 未被載入(路徑錯/未 import)檢查 web.xml contextConfigLocation
類存在但報錯編譯輸出目錄無 .class 文件Rebuild / 清理 target 重新編譯
父容器 Bean 子容器不可見雙容器隔離,反向不可見DAO/Service 放父容器,Controller 放子容器
@Autowired 報錯多實現類無 @Primary/@Qualifier指定 @Qualifier("pubCommonDAO")

遇到 NoSuchBeanDefinitionException,別慌:對照 XML 與 Java 拼寫 → 確認 Class 產出 → 搞清容器層級,三步定位 99% 原因。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved