controller函數(shù)中參數(shù)列表使用多個@RequestBody問題
controller參數(shù)列表使用多個@RequestBody
首先出現(xiàn)這種情況是因為有下面這種需求
$.ajax({ ? ?? ??? ? ? ?type: "POST", ? ?? ??? ? ? ?url: "${pageContext.request.contextPath}/courses", ? ?? ??? ? ? ?data: JSON.stringify({ ?? ??? ? ? ??? ?course:course, ?? ??? ? ?courseInfoList:courseInfoList ?? ? ? ? ? }),//將對象序列化成JSON字符串 ? ?? ??? ? ? ? ?? ??? ? ? ?dataType:"json", ? ?? ??? ? ? ?contentType : 'application/json;charset=utf-8', //設(shè)置請求頭信息 ? ?? ??? ? ? ?success: function(data){ ? ?? ??? ? ? ?}, ? ?? ??? ? ? ?error: function(res){ ? ?? ??? ? ? ?} ? ?? ??? ?});?
也就是在ajax傳輸數(shù)據(jù)時有多種數(shù)據(jù)類型在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"; ?? ?}
這樣就會出現(xiàn)400錯誤,服務(wù)器無法理解這個請求
原因
@requestbody的含義是在當前對象獲取整個http請求的body里面的所有數(shù)據(jù),因此spring就不可能將這個數(shù)據(jù)強制包裝成Course或者List類型,并且從@requestbody設(shè)計上來說,只獲取一次就可以拿到請求body里面的所有數(shù)據(jù),就沒必要出現(xiàn)有多個@requestbody出現(xiàn)在controller的函數(shù)的形參列表當中
如果想解決這種問題
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函數(shù)改為
@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是否存在的影響
首先 明確一點是 RequestBody注解的主要作用就是用于接收前端的參數(shù),當我們使用post請求的時候,我們會將參數(shù)放在request body中,此時我們就需要在Controller的方法的參數(shù)前面加上@RequestBody用來接受到前端傳過來的request body中的值。
@PostMapping("/save") ? ? public Response<?> save(@RequestBody Insurance insurance){ ? ? ? ? return null; ? ? }
不使用@RequestBody注解時,可以接收Content-Type為application/x-www-form-urlencoded類型的請求所提交的數(shù)據(jù),數(shù)據(jù)格式:aaa=111 b b b = 222 。
form 表單提交以及 jQuery的 bbb=222。form表單提交以及jQuery的bbb=222。form表單提交以及jQuery的.post()方法所發(fā)送的請求就是這種類型。
使用@RequestBody注解時,用于接收Content-Type為application/json類型的請求,
數(shù)據(jù)類型是JSON:{“aaa”:“111”,“bbb”:“222”}
以上內(nèi)容來源于不同的資料內(nèi)容。
總是就是
當入?yún)⒅挥幸粋€參數(shù)的時候,此時** @RequestBody **的注解是否存在沒有必要性,比如:String abcd;
那么前端傳參的時候:傳入
abcd = "1234"; { abcd = "1234" }
二者的區(qū)別不是很大。
只有當入?yún)⑤^多,或者是一個實體類入?yún)r,加上該注解,前端以json的形式傳參,后臺才能接收到。
注意,如果多個值入?yún)?,比如:String aaa, String bbb,String ccc,
當以這種形式入?yún)r需要加上**@RequestParam**注解,用于匹配各參數(shù)是否能一一對應(yīng)上。
@RequestParam:將請求參數(shù)綁定到你控制器的方法參數(shù)上(是springmvc中接收普通參數(shù)的注解)
語法:@RequestParam(value=”參數(shù)名”,required=”true/false”,defaultValue=””)
value
:參數(shù)名required
:是否包含該參數(shù),默認為true,表示該請求路徑中必須包含該參數(shù),如果不包含就報錯。defaultValue
:默認參數(shù)值,如果設(shè)置了該值,required=true將失效,自動為false,如果沒有傳該參數(shù),就使用默認值
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SrpingDruid數(shù)據(jù)源加密數(shù)據(jù)庫密碼的示例代碼
本篇文章主要介紹了SrpingDruid數(shù)據(jù)源加密數(shù)據(jù)庫密碼的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10Mybatis全局配置及映射關(guān)系的實現(xiàn)
本文主要介紹了Mybatis全局配置及映射關(guān)系的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03基于@MapperScan和@ComponentScan的使用區(qū)別
這篇文章主要介紹了@MapperScan和@ComponentScan的使用區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09spring?boot實現(xiàn)圖片上傳到后臺的功能(瀏覽器可直接訪問)
這篇文章主要介紹了spring?boot實現(xiàn)圖片上傳到后臺的功能(瀏覽器可直接訪問),需要的朋友可以參考下2022-04-04Java?Ribbon與openfeign區(qū)別和用法講解
Ribbon是基于Netflix?Ribbon實現(xiàn)的一套客戶端負載均衡的工具,主要功能是提供客戶端的軟件負載均衡算法和服務(wù)調(diào)用。openfeign對Feign進行了增強,使其支持Spring MVC注解,另外還整合了Ribbon和Nacos,從而使得Feign的使用更加方便2022-08-08