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

Spring MVC 表單提交後台接收不到數據?5 大常見原因與排查清單

     編輯:Java 綜合教學

Spring MVC / Struts2 表單綁定失效:從前端 name 屬性到後端 Setter 的完整鏈路排查

現象:前端 `

` 提交,後端 Action/Controller 入參對象字段全為 null 或默認值。本文提供系統化排查清單,覆蓋 90% 以上綁定失效場景。

1. 核心綁定原理

Spring MVC 使用 DataBinder + BeanWrapper:

  1. 解析請求參數(application/x-www-form-urlencoded、multipart/form-data)。
  2. 根據參數名 user.name 匹配對象屬性路徑。
  3. 調用 setName(value),支持巢狀屬性、集合、Map、類型轉換。

前提條件:屬性必須有公共 Setter 方法(或字段 public,不推薦)。

2. 五大常見原因與驗證方法

#原因現象驗證/修復
1前端 name 與後端屬性名不一致單字段為 nullF12 Network 查看 Form Data:userName=Tom vs 實體 user_name → 統一駝峰/下劃線
2實體類缺少 Setter / Setter 非 public所有字段為 nullIDE Generate Getter/Setter,檢查 public void setXxx(Xxx xxx)
3Content-Type 錯誤POST 體為空表單需 enctype="application/x-www-form-urlencoded"(默認);上傳文件用 multipart/form-data 且配置 MultipartResolver
4巢狀對象未初始化巢狀屬性 NPEUser{address=null} → setAddress(new Address()) 或構造器初始化
5類型轉換失敗字段為默認值/報錯日期需 @DateTimeFormat、枚舉需 @EnumValue、自定義 Converter / Formatter

3. 進階排查技巧

3.1 開啟 DataBinder 日誌

logging.level.org.springframework.validation.DataBinder=DEBUG
logging.level.org.springframework.beans=DEBUG

控制台將輸出綁定過程:Binding result for user: Field error in object 'user' on field 'age': rejected value [abc]。

3.2 使用 @InitBinder 註冊自定義編輯器

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
    binder.setDisallowedFields("password", "secret"); // 安全:禁止綁定敏感字段
}

3.3 檢查 HiddenHttpMethodFilter 順序

Spring Boot 默認註冊 HiddenHttpMethodFilter 將 _method=PUT 轉為 PUT 請求,但會消費請求體導致後續綁定為空。解決:spring.mvc.hiddenmethod.filter.enabled=false 或升級 Spring Boot 2.6+(默認關閉)。

4. Struts2 特有檢查點

  • Action 類實現 ModelDriven<T> 時,getModel() 必須返回同一實例(構造器 new 一次),否則每次調用返回新對象導致綁定丟失。
  • params 攔截器順序在 modelDriven 之後,確保 struts.xml 包含 <interceptor-ref name="defaultStack"/>。
  • OGNL 表達式區分大小寫,user.name 對應 getUser().getName()。

5. 快速自查 Checklist

[ ] F12 Network → Payload 確認參數名、值、Content-Type
[ ] 實體類:public、有無參構造器、所有字段 public setter
[ ] 參數名:駝峰 userName vs 下劃線 user_name(Spring 默認駝峰)
[ ] 巢狀對象:address 已初始化
[ ] 日期/枚舉/集合:有對應 Converter/Formatter
[ ] @InitBinder:無 disallowedFields 誤攔截業務字段
[ ] Multipart:上傳文件配置 CommonsMultipartResolver / StandardServletMultipartResolver
[ ] 日誌:DEBUG 級別觀察 DataBinder 輸出

6. 總結

表單綁定失效 99% 是名字不匹配或Setter 缺失。養成「先看 Network Payload,再查實體類 Setter」的肌肉記憶,分分鐘定位問題。

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