关于@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包

时间: 2024-10-24 14:40:39

关于@RequestBody的相关文章

spring @RequestBody的使用

@RequestMapping(value="/testJson",produces="application/json") public String testJson(@RequestBody AccountTest test){ System.out.println(test.getUsername()); return "index"; } 研究了下这个的使用: 如果http请求body传的是json的话就得使用他来接受了,可以直接用St

【转】@RequestParam @RequestBody @PathVariable 等参数绑定注解详解

@RequestParam @RequestBody @PathVariable 等参数绑定注解详解 2014-06-02 11:24 23683人阅读 评论(2) 收藏 举报 目录(?)[+] 引言: 接上一篇文章,对@RequestMapping进行地址映射讲解之后,该篇主要讲解request 数据到handler method 参数数据的绑定所用到的注解和什么情形下使用: 简介: handler method 参数绑定常用的注解,我们根据他们处理的Request的不同内容部分分为四类:(主

SpringMVC @RequestBody接收Json对象字符串

转:http://www.cnblogs.com/quanyongan/archive/2013/04/16/3024741.html 以前,一直以为在SpringMVC环境中,@RequestBody接收的是一个Json对象,一直在调试代码都没有成功,后来发现,其实 @RequestBody接收的是一个Json对象的字符串,而不是一个Json对象.然而在ajax请求往往传的都是Json对象,后来发现用 JSON.stringify(data)的方式就能将对象变成字符串.同时ajax请求的时候也

@RequestParam @RequestBody @PathVariable 等参数绑定注解详解(转)

简介: handler method 参数绑定常用的注解,我们根据他们处理的Request的不同内容部分分为四类:(主要讲解常用类型) A.处理requet uri 部分(这里指uri template中variable,不含queryString部分)的注解:   @PathVariable; B.处理request header部分的注解:   @RequestHeader, @CookieValue; C.处理request body部分的注解:@RequestParam,  @Reque

spring 中注解的详细解释之@Responsebody与@RequestBody

1.@responseBoby @Responsebody与@RequestBody 一.预备知识:@RequestMapping RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径. 1 @RequestMapping(value = "/aaa")//类级别,可以没有 2 public class myController { 3 @RequestMapping(value = "/

在SpringMVC中使用@RequestBody和@ResponseBody注解处理json时,报出HTTP Status 415的解决方案

我在使用SpringMVC的@RequestBody和@ResponseBody注解处理JSON数据的时候,总是出现415的错误,说是不支持所提交数据格式,我在页面中使用了JQuery的AJAX来发出JSON数据给服务器: $.ajax({ type:'post', url:'${pageContext.request.contextPath }/requestJSON.action', contentType :'application/json;charset=utf-8', //数据是JS

调用Request对象的post方法把RequestBody传入进去

通过调用登录接口发送一个post请求.跟get不一样的地方就是传参数不一样,post请求需要把参数封装到RequestBody对象,调用Request对象的post方法把RequestBody传入进去.最后调用execute方法执行请求,这个方法前面get请求的时候讲过. http://bbs.guilinlife.com/thread-9125238-1-1.htmlhttp://bbs.guilinlife.com/thread-9125240-1-1.htmlhttp://bbs.guil

@RequestBody

作用: i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上: ii) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上. 使用时机:A) GET.POST方式提时, 根据request header Content-Type的值来判断: application/x-www-form-urlencoded, 可选(即非必须,因为这种情况

@RequestBody接收ajax的json字符串

在使用ajax进行请求,并传递参数时,偶尔需要把数组作为传递参数,这是就要使用@RequestBody来解决这个问题 在页面端的处理: (1)利用JSON.stringify(arr)需要把json对象数组转变成一个json对象字符串 (2)在ajax的参数中设置"contentType": "application/json" $(function(){ $("#exe").on("click",function(){ va

@Responsebody与@RequestBody

预备知识:@RequestMapping RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径. @RequestMapping(value = "/aaa")//类级别,可以没有 public class myController { @RequestMapping(value = "/bbb")//方法级别,必须有 public String getMyName() { re