現象:前端 `
null
Spring MVC 使用 DataBinder + BeanWrapper:
DataBinder
BeanWrapper
application/x-www-form-urlencoded
multipart/form-data
user.name
setName(value)
前提條件:屬性必須有公共 Setter 方法(或字段 public,不推薦)。
userName=Tom
user_name
public void setXxx(Xxx xxx)
enctype="application/x-www-form-urlencoded"
MultipartResolver
User{address=null}
setAddress(new Address())
@DateTimeFormat
@EnumValue
Converter
Formatter
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]。
Binding result for user: Field error in object 'user' on field 'age': rejected value [abc]
@InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true)); binder.setDisallowedFields("password", "secret"); // 安全:禁止綁定敏感字段 }
Spring Boot 默認註冊 HiddenHttpMethodFilter 將 _method=PUT 轉為 PUT 請求,但會消費請求體導致後續綁定為空。解決:spring.mvc.hiddenmethod.filter.enabled=false 或升級 Spring Boot 2.6+(默認關閉)。
HiddenHttpMethodFilter
_method=PUT
spring.mvc.hiddenmethod.filter.enabled=false
ModelDriven<T>
getModel()
params
modelDriven
struts.xml
<interceptor-ref name="defaultStack"/>
getUser().getName()
[ ] F12 Network → Payload 確認參數名、值、Content-Type [ ] 實體類:public、有無參構造器、所有字段 public setter [ ] 參數名:駝峰 userName vs 下劃線 user_name(Spring 默認駝峰) [ ] 巢狀對象:address 已初始化 [ ] 日期/枚舉/集合:有對應 Converter/Formatter [ ] @InitBinder:無 disallowedFields 誤攔截業務字段 [ ] Multipart:上傳文件配置 CommonsMultipartResolver / StandardServletMultipartResolver [ ] 日誌:DEBUG 級別觀察 DataBinder 輸出
表單綁定失效 99% 是名字不匹配或Setter 缺失。養成「先看 Network Payload,再查實體類 Setter」的肌肉記憶,分分鐘定位問題。
Log4j 2.x 配置大全:從入門到高級多輸出、異步、郵件
Java 並發包源碼深度解析 隨著多核 CPU 普及,高效利
HashMap 源碼深度解析:數據結構、擴容機制、Hash
SQL 與 ORM 之爭:從手寫 SQL 到面向對象查詢的架