redis获取缓存对象bean时报:SerializationException: Could not read JSON: Could not resolve type
一、在单个应用内进行 存 取
工作中的问题场景:
将一个实体类对象set存入 redis中, 用的时候去get时,
报错提示:......SerializationException: Could not read JSON: Could not resolve type.......
明明实体类也实现 序列化接口了;
问题原因:
查看类中是否有除了get,set以外的其他方法,如果是注解开发,那就看看是不是有除了@Data以外的其他注解(如:@AllArgsConstructor 、@NoArgsConstructor);
在序列化时,只要类中方法有返回值,都会被序列化存入缓存中,存入时不会报错,
但是从缓存中取值时反序列化就会报错,因为除了对象属性字段有set方法,其他那些方法被序列号存入的值是没有set方法的
解决方案:
1、 设置redis反序列化时忽略未知属性
@Beanpublic RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);ObjectMapper objectMapper = new ObjectMapper();objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);// 此设置默认为true,就是在反序列化遇到未知属性时抛异常,这里设置为false,目的为忽略部分序列化对象存入缓存时误存的其他方法的返回值objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);jackson2JsonRedisSerializer.setObjectMapper(objectMapper);// 配置redisTemplateRedisTemplate<String, Object> rtp = new RedisTemplate<String, Object>();rtp.setConnectionFactory(lettuceConnectionFactory);RedisSerializer<?> stringSerializer = new StringRedisSerializer();// key序列化rtp.setKeySerializer(stringSerializer);// value序列化rtp.setValueSerializer(jackson2JsonRedisSerializer);// Hash key序列化rtp.setHashKeySerializer(stringSerializer);// Hash value序列化rtp.setHashValueSerializer(jackson2JsonRedisSerializer);rtp.afterPropertiesSet();return rtp;}
2、在实体类中只加 @Data注解,去掉其他会生成方法的注解或者去掉其他方法
二、多个应用交互,一个内进行 存,另一个进行 取
redis的默认通过io序列化和反序列化,
bug:当存取为vaule为实体类对象时,你发现抛标题里的异常了
原因:redis的默认通过io序列化和反序列化,于是给redis里存值时一切正常,但是另一个应用里去取值时,就会根据缓存里的类路径找寻对应的实体类进行反序列化,取得应用里当然不存在相同路径以及这个实体类,于是反序列化失败;
解决方案:
首先,这个bug属于 存 的一方的错误哦,
方法1:在redis全局配置那里配置redis的序列化和反序列化工具为fastjson这类工具,这个一搜有很多;
方法2:往redis里存的时候将实体类对象转json后再存,然后取时这样去取:
RecordBasicInfo basicInfo = JSON.parseObject(String.valueOf(info), RecordBasicInfo.class);
这里注意,转info为字符串时不要用转json工具,因为存的那一方已经转过了
redis获取缓存对象bean时报:SerializationException: Could not read JSON: Could not resolve type相关推荐
- Java的List和Json转换以及StringRedisTemplate往redis存泛型对象
List转Json List<User> user= new ArrayList(); String str = JSON.toJSONString(user); Json 转List方法 ...
- MyBatiesPlus+Redis分布式缓存
一.开启二级缓存 cache-enabled: true # mybatis-plus相关配置 mybatis-plus:# xml扫描,多个目录用逗号或者分号分隔(告诉 Mapper 所对应的 XM ...
- Redis缓存对象相关
1.想要使用redis先获得连接池对象,及JedisPool 然后在配置生成连接池对象需要的参数咯 (1)你可以写一个参数实体类,再写一个bean注入到spring @Component @Confi ...
- JAVA中创建的redis对象_详解Java在redis中进行对象的缓存
java在redis中进行对象的缓存一般有两种方法,这里介绍序列化的方法,个人感觉比较方便,不需要转来转去. 一.首先,在存储的对象上实现序列化的接口 package com.cy.example.e ...
- 获取对象的key_玩转 SpringBoot2.x 之缓存对象
作者 | 桌前明月 来源 | CSDN博客 头图 | 付费下载自视觉中国 出品 | CSDN(ID:CSDNnews) 前言 提到Redis 大部分的人首先想到的可能就是缓存,那么在 Java 项目中 ...
- Spring源码 - 从缓存中获取单例Bean
# Spring源码 - 从缓存中获取单例Bean Spring版本:Spring 5.3.13-release # 1.从缓存中获取单例Bean 单实例Bean在Spring的同一个容器中只会创建一 ...
- 利用python获取指定url在ATS中缓存对象的信息
业务需求 给定url,如何查询指定的ATS中是否有该url的缓存对象信息?如果缓存了的话,希望提供该缓存对象的大小,缓存时间,缓存文件名,缓存份数(document alternative)等等信息 ...
- java 获取spring对象数组_解析Java中如何获取Spring中配置的bean
解析Java中如何获取Spring中配置的bean Java中如何获取Spring中配置的bean?下面是由百分网小编为大家整理的解析Java中如何获取Spring中配置的bean,喜欢的可以收藏一下 ...
- java用redis缓存的步骤_详解在Java程序中运用Redis缓存对象的方法|chu
这段时间一直有人问如何在Redis中缓存Java中的List 集合数据,其实很简单,常用的方式有两种: 1. 利用序列化,把对象序列化成二进制格式,Redis 提供了 相关API方法存储二进制,取数据 ...
最新文章
- android帧动画实现方法之一
- go 用的不多的命令
- (PHP7内核剖析-3) 变量
- ubuntu下php服务器搭建_Ubuntu服务器下搭建php运行环境的方法
- nod32用户名和密码每天更新_忘记登录密码没有U盘怎么办?无U盘重置密码Win7篇
- Bug接口地址找不到
- BAL数据集与BA优化
- java代码审计文件包含_代码审计--一道简单的文件包含题目的多种利用方式
- tuxedo 强制重启
- 离散数学及其应用第1章笔记总结
- Hi3516d平台的usb功能调试记录
- 录入姓名完成座位表,学习前端的小伙伴可以关注一波,用js+html+css构成
- C语言文本文档汉字乱码处理问题
- linux bsd格式,Linux系统日志管理_Linux/BSD系统
- java 取上界_Java中的上界通配符 - java
- JZM 的印象笔记 (卷积,分块)
- 7s巡检管理系统是什么_基于微信的巡检系统7S巡检管理系统
- bal插口_中国银行银企对接接口格式(企业接口).doc
- QQ登录界面测试用例
- 购物网站系统设计与实现