关于@RequestBody

Posted 多弗朗明哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于@RequestBody相关的知识,希望对你有一定的参考价值。

首先@RequestBody需要接的参数是一个string化的json,这里直接使用JSON.stringify(json)这个方法来转化

其次@RequestBody,从名称上来看也就是说要读取的数据在请求体里,所以要发post请求

第三,要设置contentType,contentType:"application/json,明确的告诉服务器发送的内容是json,而默认的contentType是application/x-www-form-urlencoded; charset=UTF-8

那么可以开始写出代码了:

 

 1 $.ajax({  
 2     type: "post",  
 3     contentType:"application/json",  
 4     url: "repairs/saveDispatches",  
 5     data: JSON.stringify(dispatchesDTO),  
 6     success: function(data){  
 7         if(!data.success){  
 8           alertError("派工失败");  
 9         }else{  
10         alertSuccess("派工成功");  
11     }  
12 })  

 

 

后台怎么接呢?这就轮到@RequestBody出马了

 

1 @RequestMapping("/repairs/saveDispatches")  
2 public void saveDispatches(@RequestBody DispatchesDTO dispatchesDTO,  
3         HttpServletResponse response) throws IOException {  
4   
5     dispatchesService.saveDispatches(dispatchesDTO);  
6     success(response);  
7 }  

 

很简单吧,无需手动进行json与实体的转换,只要能映射上去(也就是字段名和json的key相对应,value可以匹配上数据类型),那么就可以直接转换。

如何定义“能映射上去”呢?若是json中的key在实体中都能找到对应的field,那么就是“能映射上去”,也就是说:

前台传入的json中的key在实体中必须要存在,不然就会报错,比如下面这个前台传入的json中多了一个key为id的键值对

org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Unrecognized field "id" (Class com.westsoft.kft.repairs.dto.DispatchesDTO), not marked as ignorable

 

其实要使用@RequestBody这个注解还需要额外配置一个Bean,也就是自动帮我们接收json并转成对象的消息转换器messageConverter

由于我使用的是Spring3.1之后的版本,那么配置在RequestMappingHandlerAdapter下

 

 1 <!--Spring3.1开始的注解 HandlerAdapter -->  
 2 <bean  
 3     class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">  
 4     <property name="messageConverters">  
 5         <list>  
 6             <bean  
 7                 class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">  
 8             </bean>  
 9         </list>  
10     </property>  
11 </bean>  

 

当然也可以通过<mvc:annotation-driven />来简单的配置,这里就不过多介绍了~

 

最后再要提到几点

一、若1、前台发送请求时未指定contentType为json/application 2、spring中未配置messageConverter

那么会报错误415,也就是类型不支持

前者是因为Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ not supported

而后者是因为Content type ‘application/json;charset=UTF-8‘ not supported

 

二、由于Spring中使用的json转换用到的是jackson,所以需要引入jackson包

以上是关于关于@RequestBody的主要内容,如果未能解决你的问题,请参考以下文章

关于@requestbody接收不到参数的问题

关于@RequestBody的一些分析

关于@RequestBody 有的时候能接收有的时候接收不了的情况,@RequestParam什么时候使用

记录一些遇见的bug——关于Lombok的一个大坑,使用@RequestBody接收axios请求对象时,对象所有属性均为null

记录一些遇见的bug——关于Lombok的一个大坑,使用@RequestBody接收axios请求对象时,对象所有属性均为null

关于代码片段的时间复杂度