最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis @type坑的解決

 更新時間:2024年06月03日 11:11:55   作者:strggle_bin  
新建一個對象存入redis中,對象中會出現一個字段@type,本文主要介紹了Redis @type坑的解決,具有一定的參考價值,感興趣的可以了解一下

redis中@type導致取數據解析報錯

java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to
新建一個對象存入redis中,對象中會出現一個字段@type

LoginUser user = new LoginUser ()
......
redisTemplate.opsForValue().set(key, user)

存入redis中數據如下

127.0.0.1:6379> get login_tokens:5be4de32-6eb5-44a5-b212-56d93e3fc067
"{\"@type\":\"com.common.core.domain.model.LoginUser\",\"deptId\":103L,\"expireTime\":1710463649132,\"token\":\"xxxx\",\"user\":{\"admin\":true,\"createBy\":\"admin\",\"dept\":{\"deptId\":103L,\"deptName\":\"xxx",\"orderNum\":1,\"params\":{\"@type\":\"java.util.HashMap\"},\"parentId\":101L,\"status\":\"0\"},\"deptId\":103L,\"loginDate\":\"2024-03-14 14:35:56\",\"loginIp\":\"127.0.0.1\",\"nickName\":\"xxx\",\"params\":{\"@type\":\"java.util.HashMap\"},\"phonenumber\":\"15888888888\",\"sex\":\"1\",\"status\":\"0\",\"userId\":1L,\"userName\":\"admin\"},\"userId\":1L,\"username\":\"admin\"}"
127.0.0.1:6379>

取數據時,redisTemplate.opsForValue().get(key);
如果LoginUser對象的包與存入時的包路徑不一致,會報錯java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to

redis緩存序列化導致存儲數據沒有@type

在使用redis注解將數據緩存的時候發(fā)現存儲進去的數據是這樣的,沒有@type

127.0.0.1:6379> get login_tokens:5be4de32-6eb5-44a5-b212-56d93e3fc067
"{\"deptId\":103L,\"expireTime\":1710463649132,\"token\":\"xxxx\",\"user\":{\"admin\":true,\"createBy\":\"admin\",\"dept\":{\"deptId\":103L,\"deptName\":\"xxx",\"orderNum\":1,\"parentId\":101L,\"status\":\"0\"},\"deptId\":103L,\"loginDate\":\"2024-03-14 14:35:56\",\"loginIp\":\"127.0.0.1\",\"nickName\":\"xxx\",\"phonenumber\":\"15888888888\",\"sex\":\"1\",\"status\":\"0\",\"userId\":1L,\"userName\":\"admin\"},\"userId\":1L,\"username\":\"admin\"}"
127.0.0.1:6379>

之前通過set方法放進去的數據是這樣的

127.0.0.1:6379> get login_tokens:5be4de32-6eb5-44a5-b212-56d93e3fc067
"{\"@type\":\"com.common.core.domain.model.LoginUser\",\"deptId\":103L,\"expireTime\":1710463649132,\"token\":\"xxxx\",\"user\":{\"admin\":true,\"createBy\":\"admin\",\"dept\":{\"deptId\":103L,\"deptName\":\"xxx",\"orderNum\":1,\"params\":{\"@type\":\"java.util.HashMap\"},\"parentId\":101L,\"status\":\"0\"},\"deptId\":103L,\"loginDate\":\"2024-03-14 14:35:56\",\"loginIp\":\"127.0.0.1\",\"nickName\":\"xxx\",\"params\":{\"@type\":\"java.util.HashMap\"},\"phonenumber\":\"15888888888\",\"sex\":\"1\",\"status\":\"0\",\"userId\":1L,\"userName\":\"admin\"},\"userId\":1L,\"username\":\"admin\"}"
127.0.0.1:6379>

原因:
是因為set方法的序列化方法和注解的序列化方法不同

在這里插入圖片描述

解決辦法:
將序列化方法更換成set方法所使用的序列化方法

下面是序列化方法

public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T> {
    @SuppressWarnings("unused")
    private ObjectMapper objectMapper = new ObjectMapper();

    public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;

    private Class<T> clazz;

    static {
        ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
    }

    public FastJson2JsonRedisSerializer(Class<T> clazz) {
        super();
        this.clazz = clazz;
    }

    @Override
    public byte[] serialize(T t) throws SerializationException {
        if (t == null) {
            return new byte[0];
        }
        return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
    }

    @Override
    public T deserialize(byte[] bytes) throws SerializationException {
        if (bytes == null || bytes.length <= 0) {
            return null;
        }
        String str = new String(bytes, DEFAULT_CHARSET);
        return JSON.parseObject(str, clazz);
    }

    public void setObjectMapper(ObjectMapper objectMapper) {
        Assert.notNull(objectMapper, "'objectMapper' must not be null");
        this.objectMapper = objectMapper;
    }

    protected JavaType getJavaType(Class<?> clazz) {
        return TypeFactory.defaultInstance().constructType(clazz);
    }
}

SerializerFeature.WriteClassName這個序列化

public static String getString(Object object) {
   return JSON.toJSONString(object, SerializerFeature.WriteClassName);
}

如果加了SerializerFeature.WriteClassName存進redis當中的實體類就會帶@type路徑地址
“@type”:“com.xxx.xxx.entity.OpenNotice”

問題解決方案:去掉@type 或者 兩邊@type路徑存放路徑一致 (包名和實體類修改為一致)

去掉@type使用 JSONObject.toJSONString(obj)來存value實體類

    /**
     * hashMap存值方式
     *
     * @param parentKey
     * @param fieldKey
     * @param obj
     */
    public static void hashSet(String parentKey, String fieldKey, Object obj) {
        try {
            jedis.hset(parentKey, fieldKey, JSONObject.toJSONString(obj));
            //jedis.hset(parentKey, fieldKey, JSONParser.getString(obj)); //"@type":"com.xyz.miniLegion.entity.OpenNotice"
        } finally {
            jedis.close();
        }
    }

獲取hashAll數據

   /**
     * 獲取hashGetAll
     * @param parentKey
     * @return
     */
    public Map<String, String> hashGetAll(String parentKey) {
        try (Jedis jedis = pools.getResource()) { //這種寫法不需要手動close();
            return jedis.hgetAll(parentKey);
        }catch (Exception e) {      
            return null;
        }
    }

測試Redis轉實體類`

   @Test
    void getSoldierAttribute() {
        Map<String, String> openNoticeMap = redisPoolMgr.hashGetAll(StaticData.OpenNotice);
        //第一種根據key循環(huán)
        for (String key : openNoticeMap.keySet()) {
            OpenNotice openNotice = JSONObject.parseObject(openNoticeMap.get(key), OpenNotice.class);
            System.out.println("根據key循環(huán):" +openNotice.getContent());
            System.out.println("根據key循環(huán):" + JSONObject.toJSONString(openNotice));
        }
 
        //第二種根據value循環(huán)
        for (String values : openNoticeMap.values()) {
            OpenNotice openNotice = JSONObject.parseObject(values, OpenNotice.class);
            System.out.println("根據value循環(huán):"+openNotice.getContent());
            System.out.println("根據value循環(huán):" + JSONObject.toJSONString(openNotice));
        }
    }

在這里插入圖片描述

 到此這篇關于Redis @type坑的解決的文章就介紹到這了,更多相關Redis @type坑內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • redis啟動失敗原因分析及解決過程

    redis啟動失敗原因分析及解決過程

    文章描述了在Windows系統(tǒng)上啟動Redis服務器時遇到的啟動失敗問題,并通過重啟Redis服務器解決了問題,在解決問題的過程中,作者還展示了如何使用redis-cli.exe和shutdown命令來管理和關閉Redis服務器
    2026-03-03
  • Redis全文搜索教程之創(chuàng)建索引并關聯(lián)源數據的教程

    Redis全文搜索教程之創(chuàng)建索引并關聯(lián)源數據的教程

    RediSearch提供了一種簡單快速的方法對 hash 或者 json 類型數據的任何字段建立二級索引,然后就可以對被索引的 hash 或者 json 類型數據字段進行搜索和聚合操作,這篇文章主要介紹了Redis全文搜索教程之創(chuàng)建索引并關聯(lián)源數據,需要的朋友可以參考下
    2023-12-12
  • 基于Redis實現雙加密Token的示例代碼

    基于Redis實現雙加密Token的示例代碼

    在現代分布式系統(tǒng)中,Token管理是身份驗證和授權的核心部分,本文將深入分析一個基于Redis的Token管理實現,探討其設計思路、關鍵代碼邏輯以及實現細節(jié),通過對源碼的逐層剖析,幫助讀者更好地理解Token管理的實現原理,需要的朋友可以參考下
    2025-01-01
  • Linux服務器Redis6.x安裝、配置全過程

    Linux服務器Redis6.x安裝、配置全過程

    Redis是一個高性能的鍵值對數據庫,支持多種數據類型和持久化方式,它在緩存、分布式系統(tǒng)、聊天室、任務隊列等領域有廣泛應用,本文詳細介紹了Redis的安裝、配置、高級類型和持久化機制
    2026-03-03
  • Redis?中使用?list,streams,pub/sub?幾種方式實現消息隊列的問題

    Redis?中使用?list,streams,pub/sub?幾種方式實現消息隊列的問題

    這篇文章主要介紹了Redis?中使用?list,streams,pub/sub?幾種方式實現消息隊列,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • mac安裝redis全過程

    mac安裝redis全過程

    文章內容主要介紹了如何從官網下載指定版本的Redis,以及如何在自定義目錄下安裝和啟動Redis,還提到了如何修改Redis的密碼和配置文件,以及使用RedisInsight進行可視化管理,最后,總結了一些常用的Redis命令
    2025-01-01
  • 使用Redis存儲SpringBoot項目中Session的詳細步驟

    使用Redis存儲SpringBoot項目中Session的詳細步驟

    在開發(fā)Spring Boot項目時,我們通常會遇到如何高效管理Session的問題,默認情況下,Spring Boot會將Session存儲在內存中,今天,我們將學習如何將Session存儲從內存切換到Redis,并驗證配置是否成功,需要的朋友可以參考下
    2024-06-06
  • Redis Desktop Manager(Redis可視化工具)安裝及使用圖文教程

    Redis Desktop Manager(Redis可視化工具)安裝及使用圖文教程

    這篇文章主要介紹了Redis Desktop Manager(Redis可視化工具)安裝及使用圖文教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • Redis主從復制的實現示例

    Redis主從復制的實現示例

    Redis主從復制實現多機備份,本文就來介紹一下Redis主從復制的實現示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-11-11
  • Redis主從復制詳解

    Redis主從復制詳解

    今天小編就為大家分享一篇關于Redis主從復制詳解,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01

最新評論

宝鸡市| 静安区| 怀柔区| 邓州市| 福清市| 汾阳市| 资阳市| 长治市| 毕节市| 东台市| 南木林县| 丁青县| 滁州市| 西盟| 崇左市| 宁津县| 乌拉特后旗| 读书| 濮阳县| 原阳县| 九龙县| 图木舒克市| 东方市| 江川县| 威海市| 威宁| 汉沽区| 建昌县| 萝北县| 吉首市| 江门市| 长沙县| 高台县| 海伦市| 永安市| 德化县| 新沂市| 交口县| 灵丘县| 北安市| 平陆县|