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

news/2024/8/26 9:26:45 标签: java, json, spring

问题现象

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

参考配置的类似代码:

java">@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 module
            objectMapper.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

java">public class MyRedisCacheManagerBuilderSerialCustomizer implements RedisCacheManagerBuilderCustomizer {
    @Override
    public 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.niftyadmin.cn/n/5557969.html

相关文章

在SpringCloud中实现服务监控与告警的业务指标监控

在Spring Cloud中&#xff0c;可以使用一些工具和框架来实现服务监控与告警的业务指标监控。本文将介绍一种常用的方案&#xff0c;使用Prometheus和Grafana来实现监控指标的采集和展示&#xff0c;并结合Alertmanager实现告警功能。 Prometheus简介 Prometheus是一款开源的监控…

我们应该为Maya选择Arnold CPU还是GPU?

Arnold是Autodesk著名的光线跟踪渲染器。它计算三维计算机生成的场景&#xff0c;广泛应用于专业电影制作、视觉特效和要求苛刻的拍摄。据估计&#xff0c;有300多家领先的工作室和制作公司使用Arnold作为他们的标准渲染器。Arnold可以与许多著名的软件集成&#xff0c;如3ds M…

前端面试题日常练-day88 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末 在React中&#xff0c;以下哪个生命周期方法在组件挂载后立即调用&#xff1f; a) componentDidMount() b) componentWillMount() c) componentDidUpdate() d) componentWillUpdate() 以下哪个是Reac…

为什么服务端多次send,客户端不能一次read

原因一 服务端发送的字节数过大&#xff0c;客户端来不及接受&#xff0c;可适当缩小。 原因二 客户端等待的时间过短&#xff0c;来不及接受。

详解Redis:什么是Redis?

什么是Redis? Redis&#xff08;Remote Dictionary Server&#xff09;是一种开源的、高性能的、基于内存快速读写的的数据结构存储系统&#xff0c;常用于缓存&#xff0c;分布式锁等场景&#xff1b; Redis常用数据类型有哪些&#xff1f; String(字符串) 适用场景…

原码补码反码移码

符号位为左边的第一位&#xff0c;正数的为0 &#xff0c;负数为1&#xff1b; 正数 原码、反码、补码一致&#xff1b;移码是补码符号位取反。 负数的反码为 符号位不变以原码其他位 取反&#xff0c;补码是反码加1位&#xff0c;移码是补码的符号位取反&#xff1b;

git常用命令及git分支

git常用命令及git分支 git常用命令设置用户签名初始化本地库查看本地库状态将文件添加到暂存区提交到本地库查看历史记录版本穿梭 git分支什么是分支分支的好处分支的操作查看分支创建分支切换分支删除分支合并分支合并冲突 git常用命令 设置用户签名 //设置用户签名 git con…

分布式IO系统BL201 Profinet耦合器

BL201耦合器是一个数据采集和控制系统&#xff0c;基于强大的32 位微处理器设计&#xff0c;采用Linux操作系统&#xff0c;是一种模块化的分布式I/O系统。该系统由3部分组成&#xff1a;现场总线耦合器和各种类型的&#xff08;数字和模拟信号以及特殊功能&#xff09;I/O模块…