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

Redis存储JSONObject报错:Java 8 LocalDateTime类型默认不支持

解决Redis存储JSONObject时LocalDateTime序列化失败问题

1. 确认依赖版本一致性

如果是Spring Boot项目,不要手动指定jackson-datatype-jsr310的版本,依赖Spring Boot父工程的版本管理即可,避免和核心jackson包版本冲突:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

2. 正确配置ObjectMapper

注册JavaTimeModule的同时,显式配置LocalDateTime的序列化/反序列化格式,避免默认格式问题,并用@Primary确保该实例全局优先:

@Primary
@Bean
public ObjectMapper objectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    JavaTimeModule timeModule = new JavaTimeModule();
    
    // 自定义LocalDateTime序列化格式
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    timeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter));
    timeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter));
    
    objectMapper.registerModule(timeModule);
    objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    return objectMapper;
}

3. 让RedisTemplate使用自定义ObjectMapper

Spring Boot默认的RedisTemplate不会自动复用你配置的ObjectMapper,需要手动指定序列化器:

@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory, ObjectMapper objectMapper) {
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(connectionFactory);
    
    Jackson2JsonRedisSerializer<Object> jsonSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
    jsonSerializer.setObjectMapper(objectMapper);
    
    // 配置key和value的序列化方式
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setValueSerializer(jsonSerializer);
    redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    redisTemplate.setHashValueSerializer(jsonSerializer);
    
    redisTemplate.afterPropertiesSet();
    return redisTemplate;
}

4. 缓存注解场景的额外配置

如果使用@Cacheable等缓存注解,还需配置CacheManager适配自定义序列化:

@Bean
public CacheManager cacheManager(RedisConnectionFactory connectionFactory, ObjectMapper objectMapper) {
    Jackson2JsonRedisSerializer<Object> jsonSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
    jsonSerializer.setObjectMapper(objectMapper);
    
    RedisCacheConfiguration cacheConfig = RedisCacheConfiguration.defaultCacheConfig()
            .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jsonSerializer));
    
    return RedisCacheManager.builder(connectionFactory)
            .cacheDefaults(cacheConfig)
            .build();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:35:19