首先出現這種情況是因為有下面這種需求
-
$.ajax({
-
type:
"POST",
-
url:
"${pageContext.request.contextPath}/courses",
-
data: JSON.stringify({
-
course:course,
-
courseInfoList:courseInfoList
-
}),//將對象序列化成JSON字符串
-
-
dataType:
"json",
-
contentType :
'application/json;charset=utf-8',
//設置請求頭信息
-
success:
function(data){
-
},
-
error:
function(res){
-
}
-
});
也就是在ajax傳輸數據時有多種數據類型在data域中
從而就會有下面這種controller
-
@RequestMapping(method = RequestMethod.POST ,consumes = "application/json")
-
public String createCourse(
@RequestBody Course course,
@RequestBody List<CourseInfo> courseInfoList)
-
{
-
System.
out.println(coursePackage.getCourse());
-
System.
out.println(coursePackage.getCourseInfoList());
-
-
return
"/createCourse";
-
}
這樣就會出現400錯誤,服務器無法理解這個請求
原因:
@requestbody的含義是在當前對象獲取整個http請求的body里面的所有數據,因此spring就不可能將這個數據強制包裝成Course或者List類型,並且從@requestbody設計上來說,只獲取一次就可以拿到請求body里面的所有數據,就沒必要出現有多個@requestbody出現在controller的函數的形參列表當中
如果想解決這種問題:
1.新建一個包裝上面兩種entity的entity類:
-
package com.yyc.entity;
-
-
import java.util.List;
-
-
public
class CoursePackage {
-
-
public CoursePackage() {
-
// TODO Auto-generated constructor stub
-
}
-
-
private Course course;
-
-
private List<CourseInfo> courseInfoList;
-
-
public void setCourse(Course course)
-
{
-
this.course = course;
-
}
-
-
public void setCourseInfoList(List<CourseInfo> courseInfoList)
-
{
-
this.courseInfoList = courseInfoList;
-
}
-
-
public Course getCourse()
-
{
-
return course;
-
}
-
-
public List<CourseInfo> getCourseInfoList()
-
{
-
return courseInfoList;
-
}
-
-
}
然后將controller函數改為
-
@RequestMapping(method = RequestMethod.POST ,consumes = "application/json")
-
public String createCourse(
@RequestBody CoursePackage coursePackage,Model model)
-
{
-
System.
out.println(coursePackage.getCourse());
-
System.
out.println(coursePackage.getCourseInfoList());
-
return
"/createCourse";
-
}
但是這樣又顯得比較不夠簡潔
2..用Map<String, Object>接受request body,自己反序列化到各個entity中。
例:下面這篇博客比較好:https://www.cnblogs.com/mahuan2/p/6008832.html
原文地址:https://blog.csdn.net/qq_34608620/article/details/80635139