开发者社区> 问答> 正文

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

@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可能就对了,但是如何取到具体的泛型类型?

展开
收起
爱吃鱼的程序员 2020-06-12 15:14:27 1576 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

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

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

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

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

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

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

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

    2020-06-12 15:14:43
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
workshop专场-微服务专场-开发者动手实践营-微服务-Spring Cloud Alibaba 微服务全家桶体验 立即下载
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载