關於fastjson轉換對象失敗的問題


背景: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,問題解決。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM