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
  • 相关阅读:
    通过唯一ID实现简单的日志跟踪实现
    从零单排入门机器学习:Octave/matlab的经常使用知识之矩阵和向量
    zoj 1671 Walking Ant
    JDBC基础
    Android从源码看ListView的重用机制
    JavaScript设计模式 Item9 --适配器模式Adapter
    C++11新特性之 std::forward(完美转发)
    [组合数]求组合数的几种方法总结
    HDU 4005 The war(双连通好题)
    Workspace in use or cannot be created, choose a different one.--错误解决的方法
  • 原文地址:https://www.cnblogs.com/jpfss/p/11572434.html
Copyright © 2011-2022 走看看