SpringMVC之@requestBody的作用及說(shuō)明
@requestBody的作用及說(shuō)明
1、@requestBody注解常用來(lái)處理content-type不是默認(rèn)的application/x-www-form-urlcoded編碼的內(nèi)容,比如說(shuō):application/json或者是application/xml等。
一般情況下來(lái)說(shuō)常用其來(lái)處理application/json類型?! ?/p>
2、通過(guò)@requestBody可以將請(qǐng)求體中的JSON字符串綁定到相應(yīng)的bean上,當(dāng)然也可以將其分別綁定到對(duì)應(yīng)的字符串上?! ?/p>
例如說(shuō)以下情況:
$.ajax({ ? ? ? ? url:"/login", ? ? ? ? type:"POST", ? ? ? ? ? data:'{"userName":"admin","pwd","admin123"}', ? ? ? content-type:"application/json charset=utf-8", ? ? ? ? ? success:function(data) ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? alert("request success ! "); ? ? ? ? ? ? } }); @requestMapping("/login") ? public void login(@requestBody String userName,@requestBody String pwd){ ? System.out.println(userName+" :"+pwd); }
這種情況是將JSON字符串中的兩個(gè)變量的值分別賦予了兩個(gè)字符串,但是呢假如我有一個(gè)User類,擁有如下字段:
String userName; String pwd;
那么上述參數(shù)可以改為以下形式:@requestBody User user 這種形式會(huì)將JSON字符串中的值賦予user中對(duì)應(yīng)的屬性上
需要注意的是,JSON字符串中的key必須對(duì)應(yīng)user中的屬性名,否則是請(qǐng)求不過(guò)去的?!?/p>
3、在一些特殊情況@requestBody也可以用來(lái)處理content-type類型為application/x-www-form-urlcoded的內(nèi)容,只不過(guò)這種方式不是很常用,在處理這類請(qǐng)求的時(shí)候,@requestBody會(huì)將處理結(jié)果放到一個(gè)MultiValueMap<String,String>中,這種情況一般在特殊情況下才會(huì)使用,例如jQuery easyUI的datagrid請(qǐng)求數(shù)據(jù)的時(shí)候需要使用到這種方式、小型項(xiàng)目只創(chuàng)建一個(gè)POJO類的話也可以使用這種接受方式。
作用:
- i) 該注解用于讀取Request請(qǐng)求的body部分?jǐn)?shù)據(jù),使用系統(tǒng)默認(rèn)配置的HttpMessageConverter進(jìn)行解析,然后把相應(yīng)的數(shù)據(jù)綁定到要返回的對(duì)象上;
- ii) 再把HttpMessageConverter返回的對(duì)象數(shù)據(jù)綁定到 controller中方法的參數(shù)上。
使用時(shí)機(jī):
A) GET、POST方式提時(shí), 根據(jù)request header Content-Type的值來(lái)判斷:
- application/x-www-form-urlencoded, 可選(即非必須,因?yàn)檫@種情況的數(shù)據(jù)@RequestParam, @ModelAttribute也可以處理,當(dāng)然@RequestBody也能處理);
- multipart/form-data, 不能處理(即使用@RequestBody不能處理這種格式的數(shù)據(jù));
- 其他格式, 必須(其他格式包括application/json, application/xml等。這些格式的數(shù)據(jù),必須使用@RequestBody來(lái)處理);
B) PUT方式提交時(shí), 根據(jù)request header Content-Type的值來(lái)判斷:
- application/x-www-form-urlencoded, 必須;
- multipart/form-data, 不能處理;
- 其他格式, 必須;
- 說(shuō)明:request的body部分的數(shù)據(jù)編碼格式由header部分的Content-Type指定;
使用@RequestBody瀏覽器報(bào)415錯(cuò)誤
最近在寫一個(gè)前后端分離項(xiàng)目,前后端數(shù)據(jù)交互都使用json的格式,在使用SpringMVC的@RequestBody時(shí),一直報(bào)415的錯(cuò)誤,意思就是后臺(tái)無(wú)法處理content-type=application/json格式的數(shù)據(jù),我后臺(tái)已經(jīng)使用@RequestBody,就是不行,但是如果參數(shù)類型為String就可以接收,實(shí)體類的就是不行,看了很多教程,沖浪了一天,終于找到了解決方案。
解決方式
1。在項(xiàng)目中導(dǎo)入兩個(gè)jar包
? ? <dependency> ? ? ? <groupId>org.codehaus.jackson</groupId> ? ? ? <artifactId>jackson-mapper-asl</artifactId> ? ? ? <version>1.9.13</version> ? ? </dependency> ? ? ? <dependency> ? ? ? <groupId>org.codehaus.jackson</groupId> ? ? ? <artifactId>jackson-core-asl</artifactId> ? ? ? <version>1.9.13</version> ? ? </dependency>
2.在app-servlet.xml(你的springmvc配置文件),加入一行配置
<mvc:annotation-driven/>
或者配置一個(gè)適配器(兩種方式選一個(gè)即可,我是使用的上面的方式)
? ? <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> ? ? ? ? <property name="messageConverters"> ? ? ? ? ? ? <list> ? ? ? ? ? ? ? ? <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean> ? ? ? ? ? ? </list> ? ? ? ? </property> ? ? </bean>
這樣就解決了415的報(bào)錯(cuò)。
附上我的controller層的代碼。
@RestController @CrossOrigin public class LoginController { ? ? @PostMapping("/loginPost") ? ? public String loginPost(@RequestBody User user,@RequestHeader HttpHeaders header){ ? ? ? ? System.out.println(header.getContentType()); ? ? ? ? System.out.println(user.getName()); ? ? ? ? System.out.println(user.getPassword()); ? ? ? ? return "success"; ? ? } }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot啟動(dòng)掃描不到dao層接口的解決方案
這篇文章主要介紹了springboot啟動(dòng)掃描不到dao層接口的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07zuul轉(zhuǎn)發(fā)后服務(wù)取不到請(qǐng)求路徑的解決
這篇文章主要介紹了zuul轉(zhuǎn)發(fā)后服務(wù)取不到請(qǐng)求路徑的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Java多線程 Producer and Consumer設(shè)計(jì)模式
這篇文章主要介紹了Java多線程 Producer and Consumer設(shè)計(jì)模式,producer是生產(chǎn)者的意思:指生產(chǎn)數(shù)據(jù)的線程,consumer是消費(fèi)者的意思,指的是使用數(shù)據(jù)的線程,下文圍繞Producer及Consumer展開(kāi)話題,需要的朋友可以參考一下2021-10-10最值得Java開(kāi)發(fā)者收藏的網(wǎng)站
這篇文章主要為大家分享了最值得Java開(kāi)發(fā)者收藏的11個(gè)網(wǎng)站,幫助Java開(kāi)發(fā)者提升編程能力2016-11-11自定義對(duì)象作為HashMap的Key問(wèn)題
這篇文章主要介紹了自定義對(duì)象作為HashMap的Key問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Java實(shí)現(xiàn)解析并生成xml原理實(shí)例詳解
這篇文章主要介紹了Java實(shí)現(xiàn)解析并生成xml原理實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06java與scala數(shù)組及集合的基本操作對(duì)比
這篇文章主要介紹了java與scala數(shù)組及集合的基本操作對(duì)比,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10