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

Struts2 模型驅動:Action 中 Model 對象必須實例化,否則空指針

     編輯:程式設計綜合問答

在 Struts2 模型驅動(ModelDriven<T>)模式下,Action 必須在 getModel() 返回前實例化 Model 對象,否則框架注入屬性時拋出 NullPointerException。

錯誤現象

public class UserAction extends ActionSupport implements ModelDriven<User> {
    private User user; // 未實例化
    @Override public User getModel() { return user; } // 返回 null
    // setter 注入時 user.xxx → NPE
}

正確做法

public class UserAction extends ActionSupport implements ModelDriven<User> {
    private User user = new User(); // 必須實例化
    @Override public User getModel() { return user; }
    // 或懶加載
    @Override public User getModel() {
        if (user == null) user = new User();
        return user;
    }
}

原理解析

  • Struts2 攔截器 ModelDrivenInterceptor 在調用 Action 方法前調用 getModel(),將返回對象壓入 ValueStack 栈頂。
  • 後續 ParamsInterceptor 根據表單字段名(如 username)直接對栈頂對象設值(user.setUsername(...))。
  • 若 Model 為 null,設值即拋 NPE。

最佳實踐

  • 在聲明處或構造器中 主動 new Model(),生命周期由 Action 管理,請求結束自動釋放。
  • 避免在 prepare() 中實例化(除非實現 Preparable),容易漏寫。
  • 多 Model 場景可用 Map<String, Object> 或自定義封裝類承載多個模型。

記住:ModelDriven 核心契約 = getModel() 永不返回 null。

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