Spring MVC 4.x + fastjson 1.2.7,封装的List<?>参数

两盒软妹~` 提交于 2019-12-09 18:31:28

使用spring mvc,Controller参数传参时,参数为一个对象的,在执行请求的时候,可以传递json数据,然后spring会自动解析json数据,并封装到这个对象中。

比如下面这段代码:

@RequestMapping(value = "json2Bean", consumes = "application/json", method = RequestMethod.POST)
public CoreRole json2Bean(@RequestBody CoreRole role) {
	logger.info("【json2List测试】role = {}", role.toString());
	return role;
}

 

请求代码:

$(function(){
	var data = {"code":"2","roleName":"大哥"}
	$.ajax({
		url:'/coreRole/json2Bean.do',
		data:JSON.stringify(data),
		type:'POST',
		dataType:'json',
		contentType: "application/json;charset=UTF-8",
		success:function(data){
			alert(JSON.stringify(data));
		},
		error:function(){
			alert('error');
		}
	});
})

 

但是有时候,我们需要的数据是一个对象的集合,比如批量添加数据,我们的参数可能是List<?>。

 

查阅过一些资料,说spring mvc不支持将一个json数据直接封装成List对象集合。

可是现在项目中就有这样的需求,所以我抽时间做了测试,经测试,使用@RequestBody是可以做到这一步的。

PS:项目中使用fastjson 1.2.7版本,在spring mvc的配置文件中配置了一个convert。

好了,废话不多说,上代码

fastjson依赖:

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.7</version>
</dependency>

 

spring mvc的配置文件:

<!-- 使用 fastjson替换默认jackson ,此配置请参考http://www.cnblogs.com/exmyth/p/4563673.html -->
<mvc:annotation-driven>
	<mvc:message-converters register-defaults="true">
		<!-- 配置Fastjson支持 -->
		<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
			<property name="supportedMediaTypes">
				<list>
					<value>text/html;charset=UTF-8</value>
					<value>text/json;charset=UTF-8</value>
					<value>application/json;charset=UTF-8</value>
				</list>
			</property>
			<!--  
			QuoteFieldNames-输出key时是否使用双引号,默认为true
			WriteMapNullValue-是否输出值为null的字段,默认为false
			WriteNullNumberAsZero-数值字段如果为null,输出为0,而非null
			WriteNullListAsEmpty-List字段如果为null,输出为[],而非null
			WriteNullStringAsEmpty-字符类型字段如果为null,输出为"",而非null
			WriteNullBooleanAsFalse-Boolean字段如果为null,输出为false,而非null 
			-->
			<property name="features">
				<list>
					<!-- <value>WriteMapNullValue</value> -->
					<value>QuoteFieldNames</value>
				</list>
			</property>
		</bean>
	</mvc:message-converters>
</mvc:annotation-driven>

 

Controller代码:

@RequestMapping(value = "json2List", consumes = "application/json", method = RequestMethod.POST)
public List<CoreRole> json2List(@RequestBody List<CoreRole> roles) {
	logger.info("【json2List测试】role = {}", roles.toString());
	return roles;
}

ajax代码:

$(function(){
	var dataAry=[];  
	var data2 = {"code":"1","roleName":"大哥"}
	var data1 = {"code":"2","roleName":"二哥"}
	dataAry.push(data1);
	dataAry.push(data2);
	$.ajax({
		url:'/coreRole/json2List.do',
		data:JSON.stringify(dataAry),
		type:'POST',
		dataType:'json',
		contentType: "application/json;charset=UTF-8",
		success:function(data){
			alert(JSON.stringify(data));
		},
		error:function(){
			alert('error');
		}
	});
})

测试结果:

【json2List测试】role = [{"code":"2","roleName":"二哥"}, {"code":"1","roleName":"大哥"}]

(2016年5月13日14:16:46添加)高能预警

    虽然测试结果看到似乎是正确的,但是,当我们使用这个List的时候(比如循环),会抛出异常,说这个List对象的元素是一个JSONObject对象,不能转换成目标对象。当时就纳闷了,这完全就是一个BUG。

    那么,既然这个List的元素是JSONObject,那这个List对象就是一个JSONArray对象,toString()之后就是一个JSONArray的字符串,解决方案冒出水面了,我们再使用fastjson的json字符串转对象,不是就搞定了么?返回参数就是我们希望得到的List对象了

JSON.parseArray(text, clazz)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!