新建基類 BaseAction 封裝公共方法後,原本正常的查詢功能失效:SQL 執行缺少查詢字段,頁面無數據返回。
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)
}
prepare() / 拦截器 邏輯清空參數若基類實現 Preparable 接口,prepare() 中誤將查詢條件置空;或自定義攔截器在 intercept() 中修改了 ActionContext 參數映射。
ModelDriven 實現錯誤基類實現 ModelDriven<T>,getModel() 返回 null 或新實例導致數據丟失。
struts.xml 中 <result type="json"> 但未配置 json 包;或 <result name="success">/query.jsp</result> 路徑錯誤。
devMode = true,查看控制台 Parameters 日志,確認參數是否進入 Actionexecute() 入口打斷點,檢查查詢字段值show_sql=true),對比生成 SQL 與預期ActionSupport 而非基類,驗證是否為基類問題protected + 標準 getter/setterBaseService,Action 僅負責參數接收與結果返回@Action 註解 (Struts2 Convention Plugin) 替代 XML,減少配置錯誤Struts2 「約定優於配置」的特性讓基類繼承看似簡單,實則暗藏參數注入、攔截器鏈、模型驅動等多重機制交互。遇到詭異 Bug,優先驗證「參數是否真正進入目標對象」。