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

Struts2 基類導致查詢功能失效:常見原因排查清單

     編輯:程式設計綜合問答

現象

新建基類 BaseAction 封裝公共方法後,原本正常的查詢功能失效:SQL 執行缺少查詢字段,頁面無數據返回。

高發原因排查 (按概率排序)

1. 屬性驅動字段未繼承/被覆蓋

Struts2 通過 setXxx/getXxx 自動注入請求參數。若子類重寫了屬性但未調用 super.setXxx(),或基類字段 private 導致不可見,參數注入失敗。

// 基類
public class BaseAction extends ActionSupport {
    private String queryField; // 缺少 getter/setter 或為 private
    public String getQueryField() { return queryField; }
    public void setQueryField(String v) { this.queryField = v; }
}

// 子類錯誤示例
public class UserAction extends BaseAction {
    private String queryField; // 遮蔽父類字段,Struts 注入給子類字段,父類邏輯讀不到
    // 缺少 super.setQueryField(v)
}

2. 基類 prepare() / 拦截器 邏輯清空參數

若基類實現 Preparable 接口,prepare() 中誤將查詢條件置空;或自定義攔截器在 intercept() 中修改了 ActionContext 參數映射。

3. 模型驅動 ModelDriven 實現錯誤

基類實現 ModelDriven<T>,getModel() 返回 null 或新實例導致數據丟失。

4. 結果類型/結果配置錯誤

struts.xml 中 <result type="json"> 但未配置 json 包;或 <result name="success">/query.jsp</result> 路徑錯誤。

快速定位步驟

  1. 開啟 Struts2 devMode = true,查看控制台 Parameters 日志,確認參數是否進入 Action
  2. 在基類/子類 execute() 入口打斷點,檢查查詢字段值
  3. 檢查 SQL 日志 (MyBatis/Hibernate show_sql=true),對比生成 SQL 與預期
  4. 暫時繼承 ActionSupport 而非基類,驗證是否為基類問題

最佳實踐建議

  • 基類字段統一 protected + 標準 getter/setter
  • 避免在基類構造器/prepare() 中操作業務字段
  • 公共查詢邏輯提取到 BaseService,Action 僅負責參數接收與結果返回
  • 使用 @Action 註解 (Struts2 Convention Plugin) 替代 XML,減少配置錯誤

Struts2 「約定優於配置」的特性讓基類繼承看似簡單,實則暗藏參數注入、攔截器鏈、模型驅動等多重機制交互。遇到詭異 Bug,優先驗證「參數是否真正進入目標對象」。

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