錯誤堆疊
org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type [pers.zww.grad.dao.IAdminDao] found for dependency
常見原因檢查清單
- Mapper 掃描包路徑是否正確:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="pers.zww.grad.dao" /> <!-- 確認此路徑包含 IAdminDao -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
- Component Scan 是否涵蓋 Service 層:
<context:component-scan base-package="pers.zww.grad.service" /> <-- 確保掃描到 AdminServiceImpl -->
- 介面上是否有 @Repository:已加
@Repository("adminDao"),正確。
- Mapper XML 命名空間與介面全限定名一致:
<mapper namespace="pers.zww.grad.dao.IAdminDao">
- SqlSessionFactory 的 mapperLocations 路徑:
<property name="mapperLocations" value="classpath:pers/zww/grad/mapping/*.xml" />
確認 XML 檔案實際位於該目錄。
快速驗證步驟
- 啟動專案觀察啟動日誌,搜尋
MapperScannerConfigurer 是否掃描到介面。
- 在
AdminServiceImpl 注入點加上 @Autowired(required=false) 暫時避免啟動失敗,然後在 Controller 端點檢查 adminDao 是否為 null。
- 若使用 Spring Boot,改用
@MapperScan("pers.zww.grad.dao") 簡化配置。
最佳實踐
- 統一使用
@Mapper 註解在 Mapper 介面上,免 XML 命名空間錯誤。
- 採用 Spring Boot 專案結構,依賴自動配置減少 XML 配置。
- 啟動測試注入:
ApplicationContext.getBean(IAdminDao.class) 驗證 Bean 存在。