博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于fastjson转换对象失败的问题
阅读量:6087 次
发布时间:2019-06-20

本文共 2457 字,大约阅读时间需要 8 分钟。

背景:RESTFul项目,框架为SpringMVC+MyBatis,SpringMVC中配置的message-converters为阿里的fastjson。

版本:spring4.1.6,fastjson1.2.7

最近一个项目中遇到一个问题,前端请求发生异常如下:

java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com......ActAddressVo    at com......ActivityController.updateActAddress(ActivityController.java:166) ~[ActivityController.class:na]    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_79]    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_79]    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_79]    at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_79]     ......

异常信息说明JSON对象不能转换为ActAddressVo类型对象

controller层关键代码如下:

@RequestMapping(value="updateActAddress",method=RequestMethod.POST)    private ListResponse
updateActAddress(@RequestBody List
actAddressVoList){ actAddressVoList = activityService.updateActAddress(actAddressVoList); response.setData(actAddressVoList); return response; }

service层关键代码如下:

1 @Transactional 2 @Override 3 public List
updateActAddress(List
actAddressVoList) { 4 List
retList = new ArrayList
(); 5 Iterator
iter = actAddressVoList.iterator(); 6 while(iter.hasNext()) { 7 ActAddressVo item = iter.next(); 8 // TODO update addr 9 }10 }

debug发现第7行转换出错,然后查了资料没找到原因,故而根据错误原因思考既然是fastjson转换出错,那就在这一步用一个专门的转换。

经过查阅资料发现可用JSON.parseObject(String text, Class<T> clazz)来进行强制转换,故将第7行修改为如下:

ActAddressVo item = (ActAddressVo) JSON.parseObject(iter.next().toString(), ActAddressVo.class);

然后运行发现问题依然没有解决,还是报同样的错误,晚上加班也尝试了其他办法都没有解决。

第二天早上来时突然想到会不会是因为该JSON对象的toString方法的问题,于是将iter.next()赋值给一个Object对象,然后再调用其toString方法,代码如下:

1 @Transactional 2 @Override 3 public List
updateActAddress(List
actAddressVoList) { 4 List
retList = new ArrayList
(); 5 Iterator
iter = actAddressVoList.iterator(); 6 while(iter.hasNext()) { 7 Object obj = iter.next(); 8 ActAddressVo item = (ActAddressVo) JSON.parseObject(obj.toString(), ActAddressVo.class); 9 // TODO update addr10 }11 }

运行OK,问题解决。

 

转载于:https://www.cnblogs.com/renzhigen12/p/5473906.html

你可能感兴趣的文章
阿里云公共镜像、自定义镜像、共享镜像和镜像市场的区别 ...
查看>>
shadowtunnel v1.7 发布:新增上级负载均衡支持独立密码
查看>>
Java线程:什么是线程
查看>>
mysql5.7 创建一个超级管理员
查看>>
【框架整合】Maven-SpringMVC3.X+Spring3.X+MyBatis3-日志、JSON解析、表关联查询等均已配置好...
查看>>
要想成为高级Java程序员需要具备哪些知识呢?
查看>>
带着问题去学习--Nginx配置解析(一)
查看>>
onix-文件系统
查看>>
java.io.Serializable浅析
查看>>
我的友情链接
查看>>
多线程之线程池任务管理通用模板
查看>>
CSS3让长单词与URL地址自动换行——word-wrap属性
查看>>
CodeForces 580B Kefa and Company
查看>>
开发规范浅谈
查看>>
Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming
查看>>
鼠标增强软件StrokeIt使用方法
查看>>
本地连接linux虚拟机的方法
查看>>
某公司面试java试题之【二】,看看吧,说不定就是你将要做的题
查看>>
BABOK - 企业分析(Enterprise Analysis)概要
查看>>
Linux 配置vnc,开启linux远程桌面
查看>>