springmvc的接口如果需要接受json的数据,那么需要定义@RequestBody来解析json数据,springmvc中会将接受的json数据进行解析,然后并封装到对应的实体类中,springmvc并且自持自定义解析json数据的转换器,如果使用Fastjson来转换json请求,那么在封装个参数的时候,需要注意参数的接收格式
接收参数格式问题:
- 如果请求的参数是一个对象包含List集合的类型:
{
"list": [
{
"name": "LVSHCFDC0CE080012",
"age":"沪A123456",
"gender":"维修保养"
},
...
]
}
- 并且接收的参数封装为:
//这个是接口
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数据并封装为对象类型
来源:CSDN
作者:唐宋xy
链接:https://blog.csdn.net/weixin_42054155/article/details/103673755