背景: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 ListResponseupdateActAddress(@RequestBody List actAddressVoList){ actAddressVoList = activityService.updateActAddress(actAddressVoList); response.setData(actAddressVoList); return response; }
service层关键代码如下:
1 @Transactional 2 @Override 3 public ListupdateActAddress(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 ListupdateActAddress(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,问题解决。