背景: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<ActAddressVo> updateActAddress(@RequestBody List<ActAddressVo> actAddressVoList){ actAddressVoList = activityService.updateActAddress(actAddressVoList); response.setData(actAddressVoList); return response; }
service層關鍵代碼如下:
1 @Transactional 2 @Override 3 public List<ActAddressVo> updateActAddress(List<ActAddressVo> actAddressVoList) { 4 List<ActAddressVo> retList = new ArrayList<ActAddressVo>(); 5 Iterator<ActAddressVo> 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<ActAddressVo> updateActAddress(List<ActAddressVo> actAddressVoList) { 4 List<ActAddressVo> retList = new ArrayList<ActAddressVo>(); 5 Iterator<ActAddressVo> 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 addr 10 } 11 }
運行OK,問題解決。
