根本原因是jackson2默认未注册javatimemodule,导致localdatetime被序列化为嵌套对象而非字符串,反序列化时因无无参构造器而抛invaliddefinitionexception;必须添加jackson-datatype-jsr310依赖并在redistemplate中显式注册javatimemodule。

为什么Redis存LocalDateTime会报错
根本原因不是Redis本身不支持,而是Spring Data Redis默认用的Jackson2JsonRedisSerializer在没注册JavaTimeModule时,会把LocalDateTime序列化成嵌套对象(比如{"year":2026,"month":"SEPTEMBER",...}),反序列化时找不到无参构造器,直接抛InvalidDefinitionException或SerializationException。
这不是格式“错”,而是Jackson压根没被告诉怎么读写它——和Web层返回JSON报错是同一根源,但Redis场景下容易被误认为是Redis配置问题。
必须加的依赖和基础配置
缺一不可,否则后续所有配置都无效:
-
spring-boot-starter-data-redis(已含基础Redis支持) -
jackson-datatype-jsr310(关键!没有它,JavaTimeModule根本不存在)
确认pom.xml里有这两项,且版本由Spring Boot父POM统一管理(无需手动写<version></version>)。如果项目用了Spring Boot 3.x + Java 21,该模块仍适用,无需额外升级。
RedisTemplate中正确注册JavaTimeModule
不能只配Web层的ObjectMapper,Redis用的是独立的序列化器。必须在RedisTemplate里显式构造带时间模块的ObjectMapper,再传给Jackson2JsonRedisSerializer:
@Bean
public RedisTemplate<string object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<string object> template = new RedisTemplate();
template.setConnectionFactory(factory);
// 关键:自定义ObjectMapper并注册JavaTimeModule
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule()); // 必须这行
// 可选:统一时间格式(否则默认输出ISO格式如"2026-09-03T19:04:00")
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
Jackson2JsonRedisSerializer<object> serializer = new Jackson2JsonRedisSerializer(Object.class);
serializer.setObjectMapper(mapper);
template.setValueSerializer(serializer);
template.setKeySerializer(new StringRedisSerializer());
template.afterPropertiesSet(); // 别漏掉
return template;
}
</object></string></string>
注意:mapper.registerModule(new JavaTimeModule())必须在setObjectMapper()之前调用;否则模块不生效。如果还用了GenericJackson2JsonRedisSerializer,它内部也依赖这个模块,同样要确保被注册。
容易忽略的兼容性细节
本地开发可能一切正常,但上线后出问题,往往卡在这几个点:
- 多个
@Configuration类里重复定义了RedisTemplateBean,导致你改的配置没生效 - 用了
@EnableCaching+@Cacheable,但缓存管理器(RedisCacheManager)没指定用你配的RedisTemplate,结果缓存走的还是默认序列化器 -
LocalDateTime字段在实体类上加了@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss"),但JavaTimeModule没注册时,这个注解会被忽略——别指望它救场 - 测试时用
new ObjectMapper()手动生成JSON验证序列化逻辑,但忘了这个实例和Redis用的不是同一个,结果测了等于白测
最稳妥的做法:启动后,用redis-cli直接查一条缓存数据,看createTime字段是不是字符串(如"2026-09-03 19:04:00"),而不是大括号对象。这是唯一能确认配置真正落地的验证方式。











