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

Spring 整合 Struts2:Action 構造器中訪問 ServletAPI 導致 Bean 初始化失敗

     編輯:程式設計綜合問答

異常堆棧

Caused by: java.lang.NullPointerException
    at org.apache.struts2.ServletActionContext.getResponse(ServletActionContext.java:130)
    at com.ssh2.action.UserAction.<init>(UserAction.java:20)

原因

Spring 容器啟動時實例化單例 Bean userAction,調用構造器。構造器中調用 ServletActionContext.getResponse(),但此時 **Struts2 的 FilterDispatcher 尚未初始化**,ThreadLocal 中無 HttpServletResponse,返回 null,隨後操作拋出 NPE。

解決方案

  1. 移除構造器邏輯:將依賴 ServletAPI 的代碼移至 execute() / prepare() 或 SessionAware / ServletResponseAware 接口方法中。
  2. 改用 Prototype 作用域:@Scope("prototype"),每次請求新建實例,但仍需確保在 ActionInvocation 之後調用。
  3. 推薦:Spring 管理 Service/DAO,Struts2 管理 Action:struts.xml 中 class="com.xxx.Action",Spring 只注入 Service,不攔截 Action 生命週期。

最佳實踐

  • Action 保持輕量,僅做參數接收、調用 Service、結果跳轉。
  • 使用 @Autowired 注入 Service,避免手動 getBean。
  • 啟用 struts2-spring-plugin 自動掃描注解。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved