在 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;
}
}
ModelDrivenInterceptor 在調用 Action 方法前調用 getModel(),將返回對象壓入 ValueStack 栈頂。ParamsInterceptor 根據表單字段名(如 username)直接對栈頂對象設值(user.setUsername(...))。prepare() 中實例化(除非實現 Preparable),容易漏寫。Map<String, Object> 或自定義封裝類承載多個模型。記住:ModelDriven 核心契約 = getModel() 永不返回 null。