当前位置: 首页 > news >正文

解决RedisTemplate配置JSON序列化后@Cacheable序列化仍然是JDK序列化的问题

问题现象

在参考网上的Redis集成后,配置了RedisTemplate的序列化,配置成功后@Cacheable注解的缓存仍然是jdk的序列化,配置无效。

参考配置的类似代码:

@Bean("redisTemplate")
public  RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(connectionFactory);var jackson2JsonRedisSerializer = getJackson2JsonRedisSerializer();// 设置value的序列化规则和key的序列化规则redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);redisTemplate.afterPropertiesSet();return redisTemplate;}
public static GenericJackson2JsonRedisSerializer getJackson2JsonRedisSerializer() {var jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();jackson2JsonRedisSerializer.configure(objectMapper -> {// add java8 time moduleobjectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);objectMapper.activateDefaultTyping(new LaissezFaireSubTypeValidator(),ObjectMapper.DefaultTyping.EVERYTHING);JavaTimeModule javaTimeModule = new JavaTimeModule();objectMapper.registerModule(javaTimeModule);});return jackson2JsonRedisSerializer;}

问题原因

@Cacheable未使用RedisTemplate,所以操作无效。他使用的是CacheManager

问题解决

配置CacheManager即可。

我们可以使用 RedisCacheManagerBuilderCustomizer 来自定义CacheManager

public class MyRedisCacheManagerBuilderSerialCustomizer implements RedisCacheManagerBuilderCustomizer {@Overridepublic void customize(RedisCacheManager.RedisCacheManagerBuilder builder) {RedisSerializer<String> stringRedisSerializer = new StringRedisSerializer();var jackson2JsonRedisSerializer = getJackson2JsonRedisSerializer();var configuration = builder.cacheDefaults().serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(stringRedisSerializer)).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer));builder.cacheDefaults(configuration);var configuredCaches = builder.getConfiguredCaches();// 针对有的缓存存在自定义配置的情况,读取所有缓存的配置,设置序列化方法for (String configuredCache : configuredCaches) {var cacheConfig = builder.getCacheConfigurationFor(configuredCache);cacheConfig.ifPresent(config -> {var newConfig = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(stringRedisSerializer)).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer));builder.withCacheConfiguration(configuredCache, newConfig);});}}
}
http://www.lryc.cn/news/398604.html

相关文章:

  • 人脸检测+调整分辨率+调整帧率
  • C++相关概念和易错语法(19)(继承规则、继承下的构造和析构、函数隐藏)
  • 使用GPT-4和ChatGPT构建应用项目
  • mobx学习笔记
  • 深入理解 Cowboy WebSocket:使用 Erlang/OTP 构建高效的即时通讯(IM)应用
  • 算法的几种常见形式
  • SpringBoot新手快速入门系列教程二:MySql5.7.44的免安装版本下载和配置,以及简单的Mysql生存指令指南。
  • Elasticsearch 更新指定字段
  • Koa.js、Egg.js与Express.js:探析三大Node.js框架的异同
  • 【MYSQL】如何解决 bin log 与 redo log 的一致性问题
  • 翻译语音识别在线的软件,分享4款实用的软件!
  • Qt 的Q_PROPERTY关键字
  • github 下载提速的几种方法
  • 【Oracle】实验三 Oracle数据库的创建和管理
  • Linux rpm和ssh损坏修复
  • 仕考网:公务员考试面试时间一般多长?
  • C语言作业5(学生管理系统C语言)
  • OS Copilot:新手测评体验
  • PS 2024【最新】中文白嫖版!,安装教程,图文步骤
  • bind方法的使用
  • MySQL数据库基本操作-DDL和DML
  • iOS 应用内存超过多少会收到系统内存警告 ?
  • 【分布式系统】Filebeat+Kafka+ELK 的服务部署
  • Qt Qwt 图表库详解及使用
  • 基于B站视频评论的文本分析,采用包括文本聚类分析、LDA主题分析、网络语义分析
  • 【Qt】xml Dom复制
  • MySQL联合索引最左匹配原则
  • 2024最新最全面的软件测试自动化面试题(含答案)
  • Linux磁盘-MBRGPT
  • kind kubernetes(k8s虚拟环境)使用本地docker的镜像