給定一些基于Contact具有多個欄位的類處理輸入的控制器:
@PostMapping(value="")
public String addContactMessage(@Valid @ModelAttribute("contact") Contact contact, Model model) {
// this will print the name provided in the input, without me explicitly saying contact.setName(name)
System.out.println(contact.getName();
return "index.html";
}
...假設我的 Contact 類有一個private String name屬性,帶有一個 getter 和一個 setter,并且我還有一個addContact.html帶有text fieldof的頁面name="name",當我嘗試contact.getName()在螢屏上列印時,Spring Boot 回傳我通過文本欄位輸入的聯系人的名稱.
在我看來,這很好,但我的問題是:為什么?我什至沒有提到@RequestParam()控制器的引數內部,甚至沒有實體化contact參考,以便稍后分配用戶輸入。
老實說,嘗試谷歌搜索,但一無所獲。它可能來自驗證插件嗎?我的Contact班級也添加了幾個注釋,包括 Lombok 的@Data注釋,但是將它們全部洗掉并手動撰寫 getter 和 setter 仍然會導致這種“自動映射”。洗掉 getter 和 setter 將阻止此程序的發生。
此外,輸入名稱似乎應該與類欄位名稱相同(忽略區分大小寫)(例如,對于名為 的欄位message,我應該有一個帶有 的輸入name="message")。
我的問題是,這是春天的事嗎?為什么會這樣?例如,如果我有三個 type 的方法引數會Contact怎樣?它將用戶輸入映射到所有三個?
uj5u.com熱心網友回復:
是的。它是由 Spring 的 Databinder 完成的,您可以在此處找到有關它的更多資訊。
基本上,它嘗試從 HTTP 請求的查詢引數和提交的表單資料中獲取值,并通過呼叫遵循JavaBeans 命名約定的相應公共設定器將其設定為模型的屬性。例如,對于名稱為 的查詢引數foo,它會在模型??中尋找 settersetFoo(String val)為其設定值。
關于它是如何作業的代碼,你可以參考這個作為起點。
如果控制器方法有 3 個型別的引數,Contact它們將具有系結到它們的相同值,但它們是不同的實體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/511706.html
