Spring @ModelAttribute 總結


問題

  寫這邊文章是因為最近在看了一個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 注解可以用在方法上和 方法的參數上。

  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 還有一種寫法

   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!

到此問題解決!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM