解決java.util.LinkedHashMap cannot be cast to com.km.pojo.ItemCat問題

解決java.util.LinkedHashMap cannot be cast to com.km.pojo.ItemCat

com.alibaba.fastjson.JSONObject cannot be cast to com.km.pojo.ItemCat的問題

錯誤描述

使用redis的時候,設置json格式的序列化器,使用get獲取時,因爲數據較多,使用List集合
List<ItemCat> itemCats = (List<ItemCat>) redisUtils.get("itemCats");
但是獲取的 ItemCat 對象並不能識別,jackson 會封裝成 LinkedHashMap ,fastjson會封裝成 JSONObject
遍歷list集合時,for (ItemCat itemCat : itemCats) { } 就會出現上述錯誤

經過百度+谷歌4個小時,更換jackson爲 fastjson,終於還是沒有解決,因爲網上的類似錯誤信息,都只是針對一個簡單的對象進行解析,無非是設置 Mapper,或者格式化JSONObject,都不能有效解決這裏的問題

最終序列化配置還是改爲了最初的配置,如下:
在這裏插入圖片描述

無奈之舉,新建一個簡單 User對象,測試了List<User> ,竟然可以正常使用,成功的封裝成 User對象,於是考慮可能是 對象中還包含對象的問題。

原因

兩個實體有依賴關係
在這裏插入圖片描述
在這裏插入圖片描述
原因有可能是:

  1. 因爲業務需求,查詢數據庫時,沒有查詢全部的數據,字段中含有 null值,Json無法封裝爲ItemCat對象
  2. 對象之間有依賴關係時,序列化和反序列化過程中出現問題,Json序列化器無法正常識別。

解決方案

本人能力有限,這裏採用了一種不是很好的解決方法,如果哪路大神有更好的解決方法,請告知在下,感激不盡!

方法:在存入redis之前,先把數據格式化爲 String類型的Json數據,然後存入redis,取出的時候,直接使用String類型接收數據,然後使用JSON格式化器格式化爲想要的數據,再進行業務操作。

此處只顯示了關鍵代碼,目的是爲了獲取 List<ItemCat> 類型的數據

  List<ItemCat> itemCats = null;
  String itemCatJson = (String) redisUtils.get("itemCats");
  // 先查詢 redis,若redis沒有,則查詢數據庫
  if (null == itemCatJson) {
      System.out.println("itemCats:reids中不存在,查詢數據庫數據");
      itemCats = itemCatService.getItemCats();
      // 再把查詢到數據,存入一份到緩存中
      itemCatJson = JSON.toJSONString(itemCats);
      redisUtils.set("itemCats", itemCatJson);
  } else {
      System.out.println("itemCats:從reids中獲取到數據...");
      itemCats = JSON.parseArray(itemCatJson, ItemCat.class);
      System.out.println(itemCats);
  }
如果有更好的解決方法,請告知在下,不勝感激
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章