您好,登錄后才能下訂單哦!
這篇文章主要介紹“controller函數中參數列表怎么使用多個@RequestBody”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“controller函數中參數列表怎么使用多個@RequestBody”文章能幫助大家解決問題。
首先出現這種情況是因為有下面這種需求
$.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中。
首先 明確一點是 RequestBody注解的主要作用就是用于接收前端的參數,當我們使用post請求的時候,我們會將參數放在request body中,此時我們就需要在Controller的方法的參數前面加上@RequestBody用來接受到前端傳過來的request body中的值。
@PostMapping("/save") public Response<?> save(@RequestBody Insurance insurance){ return null; }
不使用@RequestBody注解時,可以接收Content-Type為application/x-www-form-urlencoded類型的請求所提交的數據,數據格式:aaa=111 b b b = 222 。
form 表單提交以及 jQuery的 bbb=222。form表單提交以及jQuery的bbb=222。form表單提交以及jQuery的.post()方法所發送的請求就是這種類型。
使用@RequestBody注解時,用于接收Content-Type為application/json類型的請求,
數據類型是JSON:{“aaa”:“111”,“bbb”:“222”}
以上內容來源于不同的資料內容。
當入參只有一個參數的時候,此時** @RequestBody **的注解是否存在沒有必要性,比如:String abcd;
那么前端傳參的時候:傳入
abcd = "1234"; { abcd = "1234" }
二者的區別不是很大。
只有當入參較多,或者是一個實體類入參時,加上該注解,前端以json的形式傳參,后臺才能接收到。
注意,如果多個值入參,比如:String aaa, String bbb,String ccc,
當以這種形式入參時需要加上**@RequestParam**注解,用于匹配各參數是否能一一對應上。
@RequestParam:將請求參數綁定到你控制器的方法參數上(是springmvc中接收普通參數的注解)
語法:@RequestParam(value=”參數名”,required=”true/false”,defaultValue=””)
value
:參數名
required
:是否包含該參數,默認為true,表示該請求路徑中必須包含該參數,如果不包含就報錯。
defaultValue
:默認參數值,如果設置了該值,required=true將失效,自動為false,如果沒有傳該參數,就使用默認值
關于“controller函數中參數列表怎么使用多個@RequestBody”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。