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
相关产品推荐
相关产品推荐

