You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot跨项目读取Redis数据返回null的问题与解决方案

问题根因
  • 序列化器配置缺失:你操作的是Redis的Hash数据结构,但初始RedisTemplate配置仅设置了普通KV的序列化器,未配置Hash类型的key、value序列化器,默认会使用JDK序列化。JDK序列化会将类的全限定名(包名+类名)写入序列化结果,两个项目AccountDto的包名不一致时,反序列化无法找到对应类,直接返回null,只有同项目内包名一致才能正常反序列化。
  • 序列化器类型不匹配:初始配置的value序列化器为StringRedisSerializer,无法直接序列化AccountDto对象,实际存储时用的默认JDK序列化结果为私有字节格式,跨项目无法兼容解析。
修复方案说明

你执行的两个修改刚好命中问题核心:

  • 统一两个项目中AccountDto类的包名:使用GenericJackson2JsonRedisSerializer序列化时,会默认在JSON中添加@class字段存储类的全限定名,反序列化时需要根据该路径找到对应实体类,包名一致是跨项目反序列化成功的必要条件。
  • 修正RedisTemplate序列化配置:显式为Hash结构的key和value设置GenericJackson2JsonRedisSerializer序列化器,将对象序列化为标准JSON格式,不再依赖JDK序列化的私有字节格式,只要类结构、全限定名匹配就能跨项目正常读写。
附最终可用的Redis配置代码
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
    RedisTemplate<String, Object> template = new RedisTemplate<>();
    GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
    template.setConnectionFactory(redisConnectionFactory);
    template.setKeySerializer(new StringRedisSerializer());
    template.setValueSerializer(new StringRedisSerializer());
    template.setHashKeySerializer(serializer);
    template.setHashValueSerializer(serializer);
    return template;
}
可选优化点
  • 若不想强制统一Dto包名,可以自定义Jackson的类型映射,将@class指定的类型映射到当前项目的对应Dto类即可,无需修改包结构。
  • 注意你的AccountDtoCache中将hashOperations声明为静态变量,依赖实例注入的redisTemplate初始化,在多实例场景下可能出现异常,建议去掉static修饰,改为实例变量,调用时注入AccountDtoCache实例再调用方法。

内容的提问来源于stack exchange,提问作者Theara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 01:27:02