文档章节

SpringMVC @RequestBody接收Json字符串

安小乐
 安小乐
发布于 2017/04/07 20:28
字数 1041
阅读 1284
收藏 3

@RequestBody接收Json字符串

以前,一直以为在SpringMVC环境中,@RequestBody接收的是一个Json对象,一直在调试代码都没有成功,后来发现,其实 @RequestBody接收的是一个Json对象的字符串,而不是一个Json对象。然而在ajax请求往往传的都是Json对象,用JSON.stringify(data)的方式就能将对象变成字符串。同时ajax请求的时候也要指定dataType: "json",contentType:"application/json" 这样就可以将一个对象或者List传到Java端,而java的Controller中要使用@RequestBody即可绑定对象或者List.不信你试试!

JavaScript 代码:

<script type="text/javascript">  
    $(document).ready(function(){  
        var saveDataAry=[];  
        var data1={"userName":"test","address":"gz"};  
        var data2={"userName":"ququ","address":"gr"};  
        saveDataAry.push(data1);  
        saveDataAry.push(data2);         
        $.ajax({ 
            type:"POST", 
            url:"user/saveUser", 
            dataType:"json",      
            contentType:"application/json",               
            data:JSON.stringify(saveData), 
            success:function(data){ 
                                       
            } 
         }); 
    });  
</script> 

Java代码

    @RequestMapping(value = "saveUser", method = {RequestMethod.POST }}) 
    @ResponseBody  
    public void saveUser(@RequestBody List<User> users) { 
         userService.batchSave(users); 
    } 

以上转帖自:SpringMVC @RequestBody接收Json对象字符串

参考:springmvc传递json数据报415错误 [问题点数:20分]

 

<mvc:annotation-driven />

关于《SpringMVC @ResponseBody 415错误处理》文章中的观点这里测试了后发现的规律

	<!-- 开启注解(第1种方式,在使用@ResponseBody生成json对象时,IE会弹出下载文件的提示,火狐正常。) -->
    <!-- 使用上面相同的代码,这种方式不会发生415错误 -->
	<mvc:annotation-driven />

 

<!-- 开启注解(第2种方式,这里配置IE的json格式兼容性。) -->
	<mvc:annotation-driven ignore-default-model-on-redirect="true">
		<mvc:message-converters register-defaults="false">
			<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
			<bean class="org.springframework.http.converter.StringHttpMessageConverter">
				<property name="supportedMediaTypes">
					<list>
						<value>text/plain;charset=UTF-8</value>
						<value>text/html;charset=UTF-8</value>
					</list>
				</property>
			</bean>
			<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
				<property name="supportedMediaTypes">
					<list>
						<value>text/plain;charset=UTF-8</value>
						<value>text/html;charset=UTF-8</value>
						<!-- 如果注释下面这一样,相同的代码就会报415错误  -->
						<value>application/json;charset=UTF-8</value>
					</list>
				</property>
			</bean>
		</mvc:message-converters>
	</mvc:annotation-driven>

 

 

@RequestMapping

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

RequestMapping注解有六个属性,下面我们把她分成三类进行说明。

1、 value, method;

value:     指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);

method:  指定请求的method类型, GET、POST、PUT、DELETE等;

2、 params,headers;

params: 指定request中必须包含某些参数值是,才让该方法处理。

headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。

3、 consumes,produces;

consumes:指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;

@Controller
@RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json")
public void addPet(@RequestBody Pet pet, Model model) {    
    // implementation omitted
    // 方法仅处理request Content-Type为“application/json”类型的请求。
}

produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

@Controller
@RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json")
@ResponseBody
public Pet getPet(@PathVariable String petId, Model model) {    
    // implementation omitted
    // 方法仅处理request请求中Accept头中包含了"application/json"的请求,同时暗示了返回的内容类型为application/json;
}

 

 

@RequestBody

作用: 

      i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;

      ii) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。

使用时机:

A) GET、POST方式提时, 根据Request Header Content-Type的值来判断:

  • application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
  • multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);
  • 其他格式, 必须使用@RequestBody(其他格式包括application/json, application/xml等。这些Content-Type的数据,必须使用@RequestBody来处理);

B) PUT方式提交时, 根据request header Content-Type的值来判断:

  • application/x-www-form-urlencoded, 必须;
  • multipart/form-data, 不能处理;
  • 其他格式, 必须;

说明:request的body部分的数据编码格式由header部分的Content-Type指定;

 

参考:

    @RequestMapping 用法详解之地址映射(转)

    @RequestBody, @ResponseBody 注解详解(转)

本文转载自:http://www.cnblogs.com/quanyongan/archive/2013/04/16/3024741.html

安小乐
粉丝 15
博文 146
码字总数 68183
作品 0
朝阳
后端工程师
spring MVC中传递的参数对象中包含list的情况!!!!!

测试需要的jar包:spring 3.2.jar + jackson-all-1.8.5.jar。 写代码时碰到个需要将对象里的子明细一起传递到controller里去,当时就想直接将参数一起传递过来,贴下代码: controller: @Req...

yunlielai
06/10
0
0
springMVC之与json数据交互方法

因为我也要返回json数据。所以需要这个注解@ResponseBody,把Java对象转换成json字符串 注意: 1、@RequestBody不能省,因为前台发过来的数据是json数据,得用这个注解去解析该怎么接收这些数...

颖伙虫
06/20
0
0
SpringMVC转换JSON数据(1)

SpringMVC提供了处理JSON格式请求/响应的 HttpMessageConverter:MappingJackson2HttpMessageConverter。利用Jackson开源类包处理JSON格式的请求或响应消息。 我们需要做的: 在Spring容器中为...

武小猪
06/26
0
0
Springmvc中@ResponseBody和@RequestBody的使用

springmvc中通过使用jackson配置来处理springmvc对json的支持,通过@ResponseBody来将后台对象转成json对象传给调用者,通过@RequestBody来将调用者传过来的json字符串转换为后台使用的对象具...

CsOH913
2016/01/17
115
0
SpringMVC不使用@requestbody能够直接接收JSON数据映射到对象里吗?

SpringMVC不使用@requestbody能够直接接收JSON数据映射到对象里吗? 或者说@requestBody只是用来接收JSON字符串,而JSON对象可以直接被映射到对象中...

蜀黍凯
2017/02/28
724
3

没有更多内容

加载失败,请刷新页面

加载更多

精通Spring Boot——第十二篇:分页查询功能的实现

本文将介绍如何实现分页查询功能,推荐使用github的pagehelper插件实现(事实上大家基本都是这么干的),但本文的实现方式和大多数不同,废话少说,现在就带着大家看看区别在哪里。 先看pom...

developlee的潇洒人生
26分钟前
1
0
平淡的秋招之路

1. 概述 在八月中旬之前,我还没有秋招这个概念,认为找工作就是通过学校举办的招聘会。后来慢慢的了解到,由于学校实力的问题,许多好的公司只会去门当户对的学校进行招聘。我们学校只是一个...

firepation
29分钟前
1
0
设置布局中的子控件不可用

RelativeLayout R2 = findViewById(R.id.act_menu_level2_rl); //设置当前R2中的子控件不可用 int childCount = R2.getChildCount(); ......

lanyu96
40分钟前
2
0
分布式系统中处理参数配置的 4 种方案

一个系统中包含有各种各样的配置信息,如一个日志文件需要配置以下几个信息。 日志文件生成主目录 日志文件名称,不同的日志级别对应不同的文件 当前日志级别 还有其他各种业务参数、系统参数...

Java技术栈
42分钟前
2
0
MongoDB的使用学习之(七)MongoDB的聚合查询(两种方式)附项目源码

MongoDB的使用学习之(七)MongoDB的聚合查询(两种方式)附项目源码 先来张在路上…… 铛铛铛……项目源码下载地址:http://files.cnblogs.com/ontheroad_lee/MongoDBDemo.rar 此项目是用M...

Airship
48分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部