異常堆棧關鍵信息
java.lang.NullPointerException
at com.gym.action.LoginAction.login(LoginAction.java:42)
第 42 行典型代碼
List list = userDao.findAll(); // userDao 或返回值為 null
for (User u : list) { ... } // 拋出 NPE
三大排查方向
- DAO 注入失效:
userDao 為 null。檢查 applicationContext.xml 中 <bean id="userDao" class="..."/> 及 Action 中 setUserDao/構造器注入配置。
- 查詢返回 null 而非空列表:DAO 實現中
return null; 而非 return Collections.emptyList();。修改 DAO 保證永不返回 null。
- 事務/會話管理錯誤:Hibernate Session 已關閉導致懶加載失敗,或事務未提交查不到數據。檢查
OpenSessionInViewFilter 配置。
快速修復模板
// Action 中防御性編程
public String login() {
List list = userDao != null ? userDao.findAll() : Collections.emptyList();
if (list.isEmpty()) {
addActionError("無用戶數據");
return INPUT;
}
// 業務邏輯...
}
調試技巧
- 在
LoginAction.login 入口打斷點,觀察 userDao 是否為代理對象。
- 單獨運行 DAO 單元測試(JUnit + Spring Test),隔離 Web 環境驗證查詢邏輯。
- 啟用 Hibernate SQL 日誌(
hibernate.show_sql=true),確認 SQL 執行情況。