Spring @ModelAttribute 總結

問題

  寫這邊文章是由於最近在看了一個Issues ,@ModelAttribute註解接受postman傳json參數接收不到值.其實我本身對@ModelAttribute 瞭解也不太深,因而就是研究一番!java

問題 json

@RequestMapping("/test")
    public String test(@ModelAttribute("user") User user2) {
        System.out.println("user2"+JSON.toJSONString(user2));
        return "test";
    }

這樣沒法接收到postman傳入的JSON數據.app

其實主要是對@ModelAttribute用法不夠了解。post

@ModelAttribute 註解能夠用在方法上和 方法的參數上。spa

  1. 註解在方法上
    被@ModelAttribute註釋的方法會在此controller每一個方法執行前被執行。所以對於一個controller映射多個URL的用法來講,要謹慎使用。
  2. @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 還有一種寫法code

public User addUser(@RequestBody User user) {
       System.out.println("ModelAttribute:"+1);
       return user;
    }

在這個例子裏,@ModelAttribute(「user」) User user2註釋方法參數,參數user的值來源於addUser()方法中的model屬性。 orm

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
像下面:string

@RequestMapping("/test")
    public String test(@RequestBody @ModelAttribute("user") User user2) {
        System.out.println("user2"+JSON.toJSONString(user2));
        return "test";
 }

而後發現根本行不通,因此只能採用 a.從model中獲取 !
因此有了下面的解決方案:it

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!

到此問題解決!

相關文章
相關標籤/搜索