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

Struts1+Spring+iBATIS 整合啟動報錯:sqlMapClient 屬性未注入導致 Bean 創建失敗

     編輯:程式設計綜合問答

錯誤堆棧關鍵信息

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'stmStuInfoServiceTarget'...
Caused by: java.lang.IllegalArgumentException: Property 'sqlMapClient' is required
    at org.springframework.orm.ibatis.SqlMapClientTemplate.afterPropertiesSet(SqlMapClientTemplate.java:147)
    ...

配置文件片段

<bean id="sqlMapClientBase" abstract="true" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
    <property name="configLocation" value="/WEB-INF/config/sqlMapConfig.xml" />
    <property name="dataSource" ref="com.shunde.spring.dataSource" /> <!-- ❌ ref 引用錯誤 -->
</bean>

<bean id="sqlMapClient" parent="sqlMapClientBase"></bean>
...
<bean id="stmStuInfoDaoImpl" class="com.ssi.sm.dao.impl.StmStuInfoDaoImpl">
    <property name="sqlMapClient" ref="sqlMapClient" /> <!-- 需要注入 sqlMapClient -->
</bean>

根因分析

  1. 父 Bean 定義中 dataSource 引用錯誤:ref="com.shunde.spring.dataSource",但上下文中定義的數據源 Bean id 為 dataSource(<bean id="dataSource" ...>)。導致 sqlMapClientBase 初始化失敗,無法創建 SqlMapClient 實例。
  2. 子 Bean 繼承了失敗的父 Bean:sqlMapClient、sqlMapClientCount、sqlMapClientPage 都 parent="sqlMapClientBase",故它們也無法正常創建。
  3. DAO 注入失敗:stmStuInfoDaoImpl 需要 ref="sqlMapClient",但該 Bean 不存在/初始化失敗,Spring 拋出 Property 'sqlMapClient' is required。
  4. 服務層 Bean 創建連鎖失敗:stmStuInfoServiceTarget 依賴 DAO,DAO 失敗導致服務 Bean 創建拋出異常,最終上下文啟動中止。

修復方案

  1. 修正父 Bean 的 dataSource 引用:
    <property name="dataSource" ref="dataSource" /> (與 <bean id="dataSource"> 的 id 一致)。
  2. 確保 sqlMapConfig.xml 路徑正確:/WEB-INF/config/sqlMapConfig.xml 在 WAR 包中確實存在。
  3. 檢查 iBATIS 配置文件:sqlMapConfig.xml 中 <sqlMap resource="..."/> 路徑正確,映射文件存在。
  4. 重新部署並觀察啟動日誌:應無 Property 'sqlMapClient' is required 錯誤,改為正常初始化 SQL Map Client。

最佳實踐補充

  • 使用 PropertyPlaceholderConfigurer 統一管理數據源屬性(驅動、URL、用戶、密碼),避免硬編碼。
  • 考慮升級至 MyBatis(iBATIS 後繼者)+ Spring 3+/4+,獲得更好的類型安全、註解支持、動態 SQL 能力。
  • DAO 層改用 SqlSessionTemplate (MyBatis) 或 SqlMapClientTemplate (iBATIS) 統一異常轉換,減少樣板代碼。

這是一個典型的 **Spring Bean 依賴鏈斷裂** 案例:父 Bean 配置錯誤 → 子 Bean 初始化失敗 → 依賴該 Bean 的 DAO/Service 創建失敗 → 上下文啟動中止。通過錯誤堆棧定位到最上游的 sqlMapClientBase,修正其 dataSource 引用即可斷鏈修復。

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