問題
寫這邊文章是因為最近在看了一個Issues ,@ModelAttribute注解接受postman傳json參數接收不到值.其實我自己對@ModelAttribute 了解也不太深,於是就是研究一番!
問題
@RequestMapping("/test")
public String test(@ModelAttribute("user") User user2) {
System.out.println("user2"+JSON.toJSONString(user2));
return "test";
}
這樣無法接收到postman傳入的JSON數據.
其實主要是對@ModelAttribute用法不夠了解。
@ModelAttribute 注解可以用在方法上和 方法的參數上。
- 注解在方法上
被@ModelAttribute注釋的方法會在此controller每個方法執行前被執行。因此對於一個controller映射多個URL的用法來說,要謹慎使用。 - @ModelAttribute注釋一個方法的參數
注解方法參數有兩種情況
a.從model中獲取 例如下面:
@ModelAttribute("user")
public void addUser(@RequestBody User user, Model model) {
System.out.println("ModelAttribute:"+1);
model.addAttribute(user);
}
/** * test * @return string */
@RequestMapping("/test")
public String test(@ModelAttribute("user") User user2) {
System.out.println("user2"+JSON.toJSONString(user2));
return "test";
}
其中 addUser 還有一種寫法
public User addUser(@RequestBody User user) {
System.out.println("ModelAttribute:"+1);
return user;
}
在這個例子里,@ModelAttribute(“user”) User user2注釋方法參數,參數user的值來源於addUser()方法中的model屬性。
b.從Form表單或URL參數中獲取(實際上,不做此注釋也能拿到user對象)
@RequestMapping("/test")
public String test(@ModelAttribute("user") User user2) {
System.out.println("user2"+JSON.toJSONString(user2));
return "test";
}
因為上面的問題是要接收 JSON格式數據,所以b沒辦法滿足情況。我開始的想的解決辦法是加@RequestBody
像下面:
@RequestMapping("/test")
public String test(@RequestBody @ModelAttribute("user") User user2) {
System.out.println("user2"+JSON.toJSONString(user2));
return "test";
}
然后發現根本行不通,所以只能采用 a.從model中獲取 !
所以有了下面的解決方案:
public User addUser(@RequestBody User user) {
System.out.println("ModelAttribute:"+1);
return user;
}
@RequestMapping("/test")
public String test(@RequestBody @ModelAttribute("user") User user2) {
System.out.println("user2"+JSON.toJSONString(user2));
return "test";
}
其中關鍵點就是 @RequestBody!
到此問題解決!
