zoukankan      html  css  js  c++  java
  • 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!

    到此问题解决!

  • 相关阅读:
    Java分享笔记:关于Java反射机制
    Java分享笔记:自定义枚举类 & 使用enum关键字定义枚举类
    Java分享笔记:RandomAccessFile流 & 在文件指定位置插入内容
    Spark-源码-SparkContext的初始化
    Spark-源码-Spark-StartAll Master Worler启动流程
    Spark-源码-Spark-Submit 任务提交
    Hadoop2学习路程-HDFS
    JavaSE 第二次学习随笔(五)
    JavaSE 第二次学习随笔(四)
    JavaSE 第二次学习随笔(三)
  • 原文地址:https://www.cnblogs.com/mokingone/p/9108994.html
Copyright © 2011-2022 走看看