controller函數(shù)中參數(shù)列表使用多個(gè)@RequestBody問題
controller參數(shù)列表使用多個(gè)@RequestBody
首先出現(xiàn)這種情況是因?yà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í)有多種數(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錯(cuò)誤,服務(wù)器無法理解這個(gè)請求
原因
@requestbody的含義是在當(dāng)前對象獲取整個(gè)http請求的body里面的所有數(shù)據(jù),因此spring就不可能將這個(gè)數(shù)據(jù)強(qiáng)制包裝成Course或者List類型,并且從@requestbody設(shè)計(jì)上來說,只獲取一次就可以拿到請求body里面的所有數(shù)據(jù),就沒必要出現(xiàn)有多個(gè)@requestbody出現(xiàn)在controller的函數(shù)的形參列表當(dāng)中
如果想解決這種問題
1.新建一個(gè)包裝上面兩種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,自己反序列化到各個(gè)entity中。
@RequestBody是否存在的影響
首先 明確一點(diǎn)是 RequestBody注解的主要作用就是用于接收前端的參數(shù),當(dāng)我們使用post請求的時(shí)候,我們會將參數(shù)放在request body中,此時(shí)我們就需要在Controller的方法的參數(shù)前面加上@RequestBody用來接受到前端傳過來的request body中的值。
@PostMapping("/save")
? ? public Response<?> save(@RequestBody Insurance insurance){
? ? ? ? return null;
? ? }不使用@RequestBody注解時(shí),可以接收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注解時(shí),用于接收Content-Type為application/json類型的請求,
數(shù)據(jù)類型是JSON:{“aaa”:“111”,“bbb”:“222”}
以上內(nèi)容來源于不同的資料內(nèi)容。
總是就是
當(dāng)入?yún)⒅挥幸粋€(gè)參數(shù)的時(shí)候,此時(shí)** @RequestBody **的注解是否存在沒有必要性,比如:String abcd;
那么前端傳參的時(shí)候:傳入
abcd = "1234";
{
abcd = "1234"
}二者的區(qū)別不是很大。
只有當(dāng)入?yún)⑤^多,或者是一個(gè)實(shí)體類入?yún)r(shí),加上該注解,前端以json的形式傳參,后臺才能接收到。
注意,如果多個(gè)值入?yún)ⅲ热纾篠tring aaa, String bbb,String ccc,
當(dāng)以這種形式入?yún)r(shí)需要加上**@RequestParam**注解,用于匹配各參數(shù)是否能一一對應(yīng)上。
@RequestParam:將請求參數(shù)綁定到你控制器的方法參數(shù)上(是springmvc中接收普通參數(shù)的注解)
語法:@RequestParam(value=”參數(shù)名”,required=”true/false”,defaultValue=””)
value:參數(shù)名required:是否包含該參數(shù),默認(rèn)為true,表示該請求路徑中必須包含該參數(shù),如果不包含就報(bào)錯(cuò)。defaultValue:默認(rèn)參數(shù)值,如果設(shè)置了該值,required=true將失效,自動為false,如果沒有傳該參數(shù),就使用默認(rèn)值
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot+MyBatis實(shí)現(xiàn)登錄案例
前端時(shí)間在網(wǎng)上看到有朋友在學(xué)習(xí)springboot項(xiàng)目的搭建過程,今天就抽空給大家分享一個(gè)案例幫助大家學(xué)習(xí)SpringBoot+MyBatis實(shí)現(xiàn)登錄功能,具體實(shí)現(xiàn)代碼跟隨小編一起看看吧2021-06-06
關(guān)于Java的對象序列化流和反序列化流詳細(xì)解讀
這篇文章主要介紹了關(guān)于Java的對象序列化流和反序列化流,對象序列化:就是將對象保存到磁盤中,或者在網(wǎng)絡(luò)中傳輸對象,反之,自己序列還可以從文件中讀取回來,重構(gòu)對象,對它進(jìn)行反序列化,需要的朋友可以參考下2023-05-05

