spring mvc采用fastjson后,List 泛型反序列化报错,如何解决?

hzwei206 发布于 2015/08/10 14:45
阅读 3K+
收藏 0

@wenshao 你好,想跟你请教个问题:

在spring mvc中,我用fastjson替换默认是Jackson,有个方法的反序列化出现问题,方法是这么声明的:

 @ResponseBody  public BaseResp batchImportSomeThing(@RequestBody List<SomeThing> dataList)

其中List的泛型SomeThing是个实现了Serializable接口的类。在使用Jackson时,没有问题,在换成fastjson后系统运行报错:java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com.some.package.path.SomeThing

前端传的json数据格式为数组: [{.....}, {.....}],在不改变这个json数据的前提下,如何解决这个问题?我的fastjson版本为1.2.3

是不是要修改com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter类的protected Object readInternal(Class<? extends Object> clazz, HttpInputMessage inputMessage)方法:


@Override
protected Object readInternal(Class<? extends Object> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {

    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    InputStream in = inputMessage.getBody();

    byte[] buf = new byte[1024];
    for (;;) {
        int len = in.read(buf);
        if (len == -1) {
            break;
        }

        if (len > 0) {
            baos.write(buf, 0, len);
        }
    }

    byte[] bytes = baos.toByteArray();
    return JSON.parseObject(bytes, 0, bytes.length, charset.newDecoder(), clazz);
}

JSON.parseObject这里要判断,如果反序列化的是数组,改用JSON.parseArray可能就对了,但是如何取到具体的泛型类型?

加载中
0
j
jder

即便修改这方法我觉得也解决不了问题,这里的clazz仅是一个java.util.List,不包含泛型信息。

Class和ParameterizedType 都继承子Type,java API上说:ParameterizedType 表示参数化类型,如 Collection<String>。   所以只用Class获取不到集合中的类型,再说fastjson中的parseArray中传的Class是集合中的具体类型,也就是说你获取不到那个具体类型即便知道这是个集合用parseArray也不行。

所以问题的根本是拿到ParameterizedType,也就是List<Something>,直接用parseObject就行。

spring源码基本没读过,写各类继承FastJsonHttpMessageConverter或者把里面的内容复制粘贴一份修改也行

0
h
hzwei206
@wenshao 请问fastjson现在的版本,有解决这个问题吗?或者fastjson认为这不是个问题,无需解决?
0
wenshao
wenshao

这个应该能要支持的,能把问题反馈到github issue上么,那样我才好找人跟踪处理

https://github.com/alibaba/fastjson/issues

返回顶部
顶部