SpringMVC之@requestBody的作用及說明
@requestBody的作用及說明
1、@requestBody注解常用來處理content-type不是默認的application/x-www-form-urlcoded編碼的內(nèi)容,比如說:application/json或者是application/xml等。
一般情況下來說常用其來處理application/json類型?! ?/p>
2、通過@requestBody可以將請求體中的JSON字符串綁定到相應的bean上,當然也可以將其分別綁定到對應的字符串上?! ?/p>
例如說以下情況:
$.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字符串中的兩個變量的值分別賦予了兩個字符串,但是呢假如我有一個User類,擁有如下字段:
String userName; String pwd;
那么上述參數(shù)可以改為以下形式:@requestBody User user 這種形式會將JSON字符串中的值賦予user中對應的屬性上
需要注意的是,JSON字符串中的key必須對應user中的屬性名,否則是請求不過去的?!?/p>
3、在一些特殊情況@requestBody也可以用來處理content-type類型為application/x-www-form-urlcoded的內(nèi)容,只不過這種方式不是很常用,在處理這類請求的時候,@requestBody會將處理結果放到一個MultiValueMap<String,String>中,這種情況一般在特殊情況下才會使用,例如jQuery easyUI的datagrid請求數(shù)據(jù)的時候需要使用到這種方式、小型項目只創(chuàng)建一個POJO類的話也可以使用這種接受方式。
作用:
- i) 該注解用于讀取Request請求的body部分數(shù)據(jù),使用系統(tǒng)默認配置的HttpMessageConverter進行解析,然后把相應的數(shù)據(jù)綁定到要返回的對象上;
- ii) 再把HttpMessageConverter返回的對象數(shù)據(jù)綁定到 controller中方法的參數(shù)上。
使用時機:
A) GET、POST方式提時, 根據(jù)request header Content-Type的值來判斷:
- application/x-www-form-urlencoded, 可選(即非必須,因為這種情況的數(shù)據(jù)@RequestParam, @ModelAttribute也可以處理,當然@RequestBody也能處理);
- multipart/form-data, 不能處理(即使用@RequestBody不能處理這種格式的數(shù)據(jù));
- 其他格式, 必須(其他格式包括application/json, application/xml等。這些格式的數(shù)據(jù),必須使用@RequestBody來處理);
B) PUT方式提交時, 根據(jù)request header Content-Type的值來判斷:
- application/x-www-form-urlencoded, 必須;
- multipart/form-data, 不能處理;
- 其他格式, 必須;
- 說明:request的body部分的數(shù)據(jù)編碼格式由header部分的Content-Type指定;
使用@RequestBody瀏覽器報415錯誤
最近在寫一個前后端分離項目,前后端數(shù)據(jù)交互都使用json的格式,在使用SpringMVC的@RequestBody時,一直報415的錯誤,意思就是后臺無法處理content-type=application/json格式的數(shù)據(jù),我后臺已經(jīng)使用@RequestBody,就是不行,但是如果參數(shù)類型為String就可以接收,實體類的就是不行,看了很多教程,沖浪了一天,終于找到了解決方案。
解決方式
1。在項目中導入兩個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/>
或者配置一個適配器(兩種方式選一個即可,我是使用的上面的方式)
? ? <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的報錯。
附上我的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";
? ? }
}總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
如何使用Gradle實現(xiàn)類似Maven的profiles功能
這篇文章主要介紹了如何使用Gradle實現(xiàn)類似Maven的profiles功能,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-06-06
Spring Boot訪問靜態(tài)資源css/js,你真的懂了嗎
在搭建springboot時經(jīng)常需要在html中訪問一些靜態(tài)資源,很多朋友不清楚如何在 Spring Boot中訪問靜態(tài)資源,本文給大家?guī)韮煞N解決方案,感興趣的朋友跟隨小編一起看看吧2021-05-05
spring boot配置ssl實現(xiàn)HTTPS的方法
這篇文章主要介紹了spring boot配置ssl實現(xiàn)HTTPS的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03
Java源碼解析HashMap的tableSizeFor函數(shù)
今天小編就為大家分享一篇關于Java源碼解析HashMap的tableSizeFor函數(shù),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01
java正則表達式實現(xiàn)提取需要的字符并放入數(shù)組【ArrayList數(shù)組去重復功能】
這篇文章主要介紹了java正則表達式實現(xiàn)提取需要的字符并放入數(shù)組,即基于正則的ArrayList數(shù)組去重復功能,具有一定參考借鑒價值,需要的朋友可以參考下2017-01-01

