zoukankan      html  css  js  c++  java
  • controller函数中参数列表使用多个@RequestBody

    首先出现这种情况是因为有下面这种需求

    1. $.ajax({
    2. type: "POST",
    3. url: "${pageContext.request.contextPath}/courses",
    4. data: JSON.stringify({
    5. course:course,
    6. courseInfoList:courseInfoList
    7.        }),//将对象序列化成JSON字符串
    8. dataType:"json",
    9. contentType : 'application/json;charset=utf-8', //设置请求头信息
    10. success: function(data){
    11. },
    12. error: function(res){
    13. }
    14. });

    也就是在ajax传输数据时有多种数据类型在data域中

    从而就会有下面这种controller

    1. @RequestMapping(method = RequestMethod.POST ,consumes = "application/json")
    2. public String createCourse(@RequestBody Course course, @RequestBody List<CourseInfo> courseInfoList)
    3. {
    4. System.out.println(coursePackage.getCourse());
    5. System.out.println(coursePackage.getCourseInfoList());
    6. return "/createCourse";
    7. }

    这样就会出现400错误,服务器无法理解这个请求

    原因:

    @requestbody的含义是在当前对象获取整个http请求的body里面的所有数据,因此spring就不可能将这个数据强制包装成Course或者List类型,并且从@requestbody设计上来说,只获取一次就可以拿到请求body里面的所有数据,就没必要出现有多个@requestbody出现在controller的函数的形参列表当中

    如果想解决这种问题

    1.新建一个包装上面两种entity的entity类:

    1. package com.yyc.entity;
    2. import java.util.List;
    3. public class CoursePackage {
    4. public CoursePackage() {
    5. // TODO Auto-generated constructor stub
    6. }
    7. private Course course;
    8. private List<CourseInfo> courseInfoList;
    9. public void setCourse(Course course)
    10. {
    11. this.course = course;
    12. }
    13. public void setCourseInfoList(List<CourseInfo> courseInfoList)
    14. {
    15. this.courseInfoList = courseInfoList;
    16. }
    17. public Course getCourse()
    18. {
    19. return course;
    20. }
    21. public List<CourseInfo> getCourseInfoList()
    22. {
    23. return courseInfoList;
    24. }
    25. }

    然后将controller函数改为

    1. @RequestMapping(method = RequestMethod.POST ,consumes = "application/json")
    2. public String createCourse(@RequestBody CoursePackage coursePackage,Model model)
    3. {
    4. System.out.println(coursePackage.getCourse());
    5. System.out.println(coursePackage.getCourseInfoList());
    6. return "/createCourse";
    7. }

    但是这样又显得比较不够简洁

    2..用Map<String, Object>接受request body,自己反序列化到各个entity中。

    例:下面这篇博客比较好:https://www.cnblogs.com/mahuan2/p/6008832.html

    原文地址:https://blog.csdn.net/qq_34608620/article/details/80635139
  • 相关阅读:
    Array中使用异步函数遍历元素,Array循环同步执行
    vscode设置快捷键"h"快速生成html模板
    IOS(苹果手机)使用video播放HLS流,实现在内部播放及全屏播放(即非全屏和全屏播放)。
    FTP服务器与客户端的安装与配置
    移动端页面顶部滑动实现菜单的弹出与隐藏
    JS十大经典排序排序算法
    【bug】table重新加载数据,页面滚动条下沉到底部,记录scrollTop后将其恢复scrollTop出现闪烁
    寄生组合式继承
    扁平对象,转为树形对象
    使用CSS禁止textarea调整大小功能的方法
  • 原文地址:https://www.cnblogs.com/jpfss/p/11572434.html
Copyright © 2011-2022 走看看