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!

到此问题解决!

相关文章
相关标签/搜索