一次fastjson解析问题导致的springmvc接收List格式参数问题

瘦欲@ 提交于 2019-12-23 23:47:57

springmvc的接口如果需要接受json的数据,那么需要定义@RequestBody来解析json数据,springmvc中会将接受的json数据进行解析,然后并封装到对应的实体类中,springmvc并且自持自定义解析json数据的转换器,如果使用Fastjson来转换json请求,那么在封装个参数的时候,需要注意参数的接收格式

接收参数格式问题:

  1. 如果请求的参数是一个对象包含List集合的类型:
{
	"list": [
		{
			"name": "LVSHCFDC0CE080012",
			"age":"沪A123456",
			"gender":"维修保养"
		},
		...
	]
}
  1. 并且接收的参数封装为:
//这个是接口
public Response index(@RequestBody ReqListVo<UserVo> vo) {
}
// 这个是RequListVo对象
@Data
public class ReqListVo<T> {

    public List<T> list;

}
// List中包含的对象
public class UserVo {

    private String name;

    private String age;

    private String gender;
}

这样封装一般是没有问题,定义一个对象,并设置泛型,然后实现传递的具体的实体类,实现接收的参数不同,但是定义的对象都是一致的,相当于实现了一个通用的实体类。
但是,如果是使用了springmvc中指定fastjson来作为转换json数据为实体类的转换器,并且fastjson的版本是2.8.8

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.8.8</version>
</dependency>

那么,这样写,就会报错:Request processing failed; nested exception is java.lang.ClassCastException: 类型转换错误,尝试换了一个版本,就可以使用泛型来接收了,所以,应该是这个版本的fastjson导致,无法定义泛型来接收json参数。

所以,可以直接修改为:

// 这里直接使用List集合的封装对象,不实用泛型
public Response index(@RequestBody UserListVo vo) {
}
@Data
public class UserListVo {
    public List<UserVo> list;
}

这样就可以正常接收参数,所以这个版本的fastJson最好不要使用泛型来定义对象接收json参数 或者 转换json为对象类型。

还有一种解决方式,升级fastjson版本:

 <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.9</version>
</dependency>

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

升级到这个版本或者其他版本,就可以定义泛型 来接收json数据并封装为对象类型

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