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!

到此问题解决!

posted on 2018-05-11 17:25  未亦末  阅读(2691)  评论(0编辑  收藏  举报