@RequestBody注解Ajax post json List集合數(shù)據(jù)請求400/415的處理
@RequestBody注解Ajax post json List集合數(shù)據(jù)請求400/415
該問題出現(xiàn)在ajax發(fā)送post請求時(shí)返回錯(cuò)誤代碼,后臺不報(bào)任何錯(cuò)誤
問題原因和解決方法:
1.post發(fā)送的json數(shù)據(jù)錯(cuò)誤
@RequestBody注解是把post請求的整體數(shù)據(jù)進(jìn)行處理,@RequestBody后面的參數(shù)是和json數(shù)據(jù)沒有關(guān)系的,比如
@RequestBody List<CourseVo> courseVos; //此句的courseVos不用在json數(shù)據(jù)中包含!?。。。?/pre>
發(fā)送該數(shù)據(jù)的js為下
$.ajax({
? ? ?type: "post",
? ? ?url: '/beansOffice/addCourseData',
? ? ?dataType:"json",
? ? ?contentType:"application/json",
? ? ?data: JSON.stringify(this.courseView),//此塊注意
? ? ?//注意數(shù)據(jù)是data: JSON.stringify(this.courseView) ??
? ? ?//而不是data: JSON.stringify({courseVos:this.courseView})
? ? ?//兩者區(qū)別就是有沒有把@RequestBody注解后的“courseVos”當(dāng)為json數(shù)據(jù)
? ? ?success: function (data) {
? ? ? ? if (data.status == 200 && data.body.code == 200)
? ? ? ? ? ? ? alert("提交成功!");
? ? ?}
});2.Spring或maven版本過低導(dǎo)致jackson包沒有導(dǎo)入
jackson是spring默認(rèn)的json處理工具,沒有該包則會(huì)對一些復(fù)雜對象會(huì)處理異常
依賴包為下(當(dāng)前最新):
<dependency> ? ? <groupId>org.codehaus.jackson</groupId> ? ? <artifactId>jackson-core-asl</artifactId> ? ? <version>1.9.13</version> </dependency> <dependency> ? ? <groupId>org.codehaus.jackson</groupId> ? ? <artifactId>jackson-mapper-asl</artifactId> ? ? <version>1.9.8</version> </dependency>
3.json數(shù)據(jù)和對象數(shù)據(jù)轉(zhuǎn)換出問題
這個(gè)問題很容易出,由于異常被吃掉很不容易發(fā)現(xiàn)
比如對象中定義數(shù)據(jù) int a;但是你有可能默認(rèn)值是“”,即空字符串,則也會(huì)直接報(bào)400錯(cuò)誤而后臺沒有任何異常
還有一些比如時(shí)間類型(data)、布爾(boolean)或自定義類型,建議所有都使用String,自己手動(dòng)在后臺轉(zhuǎn)換,這樣報(bào)錯(cuò)也會(huì)被發(fā)現(xiàn)
$.ajax 中關(guān)于get、post 與@RequestBody和@RequestParam使用注意
1、在GET請求中,不能使用@RequestBody。因?yàn)橥鵊ET請求里加body是不符合規(guī)范的,不保證所有的實(shí)現(xiàn)都支持,所以在ajax 里注意請求方式如果用 get 后端參數(shù)不能用 @RequestBody 來接收它。(所以本人在 ajax ,或者什么表單,一般愛好用post,既安全,又能解決中文亂碼問題)
2、在POST請求,可以使用@RequestBody和@RequestParam,但是如果使用@RequestBody,對于參數(shù)轉(zhuǎn)化的配置必須統(tǒng)一??梢允褂枚鄠€(gè)@RequestParam獲取數(shù)據(jù),@RequestBody不可以只能一個(gè)。
3、ajax請求默認(rèn) contentType=application/x-www-form-urlencoded;charset:utf-8,此格式為表單提交格式,數(shù)據(jù)為key1=value1&key2=value2格式
不使用contentType:‘application/json;charset=UTF-8’, 則data里可以是json對象的屬性
$.ajax({
?? ?url: "",
?? ?type: "POST",
?? ?dataType: "JSON",
?? ?data: {"id": 1},
?? ?async: false,
?? ?success: function(){
?? ?
?? ?}
});注意:data 右邊花括號外邊是沒有雙引號或引號的 “” ‘’,所以data叫做 json對象,而不是叫json字符串,里面是其屬性。(所以上面是不使用contentType:'application/json;charset=UTF-8’的例子)
使用contentType:'application/json;charset=UTF-8’的例子:就得使用json字符串而非 JSON 對象了
$.ajax({
?? ?url: "",
?? ?type: "POST",
?? ?dataType: "JSON",
?? ?contentType: "application/json",
?? ?data: "{'id': "+ 1 + "}",
?? ?async: false,
?? ?success: function(){
?? ?
?? ?}
});data 右邊括號外有引號的叫 JSON 字符串
前端發(fā)送復(fù)雜JSON數(shù)據(jù),后端使用@RequestBody接收
舉例子:
$.ajax({
?? ?url: "",
?? ?type: "POST",
?? ?dataType: "JSON",
?? ?contentType: "application/json;charset=UTF-8",
?? ?data: JSON.stringify({
?? ??? ?id:"1"
?? ?}),
?? ?async: false,
?? ?success: function(){
?? ?
?? ?}
});后端用 @RequestBody 來接收傳過來的json字符串
注意:
- JSON.stringify 是從一個(gè)對象中解析出字符串
- JSON.parse是從一個(gè)字符串中解析出json(鍵值對)
- 使用:contentType:‘application/json;charset=UTF-8’, 配合:data:JSON.stringify()
@RequestParam 介紹
主要用來接收GET請求拼接在URL后的參數(shù),或者是POST傳遞,且Content-type為x-www-form-urlencoded方式。
因?yàn)椴还苁荊ET方式還是用x-www-form-urlencoded方式傳遞,參數(shù)都是以鍵值對方式拼接的,然后經(jīng)過URLencoded編碼,傳遞給服務(wù)端。
@RequestParam 只能接收簡單參數(shù)類型,復(fù)雜的參數(shù)類型要用 @RequestBody 來接收,或者不加注解來接收。
@RequestBody 介紹
使用 @RequestBody 該注解,前端請求只能為 POST,因?yàn)樵撟⒔馐菑恼埱篌w中獲得對象的。且請求頭中的Content-type一般為application/json 方式。
所以使用該注解能夠接收 JSON 格式的數(shù)據(jù),并且能把接收到的 JSON 數(shù)據(jù)綁定到 JAVA 對象中。復(fù)雜對象包括List,實(shí)體類,Map對象等。
在用該注解的時(shí)候有兩個(gè)注意事項(xiàng):
- 一個(gè)方法中只能有一個(gè)@RequestBody注解,但是@RequestBody注解可以和@RequestParam注解一起使用,而且@RequestParam注解一個(gè)方法中可以有多個(gè)。
- @RequestBody注解的參數(shù)類型可以是復(fù)雜對象類。
不加注解接收
- 不加注解接收參數(shù),參數(shù)類型可以為簡單類型,也可以為復(fù)雜類型(JAVA對象等,前端傳遞的參數(shù)會(huì)和類中的屬性名對應(yīng)并且綁定)。也就是兩種類型都可接收。
- 而且GET請求和POST請求也都能接收到參數(shù)。
- 但是POST請求時(shí),和@RequestParam注解一樣,Content-type只能為x-www-form-urlencoded。
- 不加注解可以接收復(fù)雜對象,但是不能接收Map類型的對象。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何把spring boot應(yīng)用發(fā)布到Harbor
這篇文章主要介紹了如何把spring boot應(yīng)用發(fā)布到Harbor,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
SpringCloud負(fù)載均衡實(shí)現(xiàn)定向路由詳情
這篇文章主要介紹了SpringCloud負(fù)載均衡實(shí)現(xiàn)定向路由詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
SpringBoot?RESTful?應(yīng)用中的異常處理梳理小結(jié)
這篇文章主要介紹了SpringBoot?RESTful?應(yīng)用中的異常處理梳理小結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
零基礎(chǔ)學(xué)Java:Java開發(fā)工具 Eclipse 安裝過程創(chuàng)建第一個(gè)Java項(xiàng)目及Eclipse的一些基礎(chǔ)使用技巧
這篇文章主要介紹了零基礎(chǔ)學(xué)Java:Java開發(fā)工具 Eclipse 安裝過程創(chuàng)建第一個(gè)Java項(xiàng)目及Eclipse的一些基礎(chǔ)使用技巧,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
Spring定時(shí)任務(wù)注解@Scheduled詳解
這篇文章主要介紹了Spring定時(shí)任務(wù)注解@Scheduled詳解,@Scheduled注解是包org.springframework.scheduling.annotation中的一個(gè)注解,主要是用來開啟定時(shí)任務(wù),本文提供了部分實(shí)現(xiàn)代碼與思路,需要的朋友可以參考下2023-09-09
Java web入門指南之在Idea上創(chuàng)建Java web項(xiàng)目
好多書上的JavaWeb教程都是Eclipse以及MyEclipse,當(dāng)然這里不論IDE的好壞,下面這篇文章主要給大家介紹了關(guān)于Java web入門指南之在Idea上創(chuàng)建Java web項(xiàng)目的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06
Java如何接收XML格式參數(shù)并轉(zhuǎn)換為JSON
在 Java 應(yīng)用程序中,處理 XML 數(shù)據(jù)并將其轉(zhuǎn)換為 JSON 格式是很常見的任務(wù),這篇文章為大家整理了一下具體的實(shí)現(xiàn)方法,希望對大家有所幫助2025-03-03
教你快速學(xué)會(huì)JPA中所有findBy語法規(guī)則
這篇文章主要介紹了教你快速學(xué)會(huì)JPA中所有findBy語法規(guī)則,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Java對象布局(JOL)實(shí)現(xiàn)過程解析
這篇文章主要介紹了Java對象布局(JOL)實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04

