diff --git a/src/main/java/com/yunhai/userbase/config/CacheConfig.java b/src/main/java/com/yunhai/userbase/config/CacheConfig.java index 4399a87..444784a 100644 --- a/src/main/java/com/yunhai/userbase/config/CacheConfig.java +++ b/src/main/java/com/yunhai/userbase/config/CacheConfig.java @@ -4,7 +4,9 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.github.benmanes.caffeine.cache.Caffeine; import com.yunhai.userbase.utils.ConstantUtil; import org.springframework.cache.Cache; @@ -40,13 +42,7 @@ public class CacheConfig { @Bean public RedisCacheManager redisCacheManager(RedisConnectionFactory factory) { Jackson2JsonRedisSerializer jacksonSerializer = new Jackson2JsonRedisSerializer<>(Object.class); - ObjectMapper mapper = new ObjectMapper(); - // 允许任意字段可见,保证反序列化不依赖 getter/setter - mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); - // 记录完整类型信息,保证泛型/多态对象反序列化正常(解决 JDK 序列化乱码、泛型丢失) - mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, - ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); - jacksonSerializer.setObjectMapper(mapper); + jacksonSerializer.setObjectMapper(newCacheObjectMapper()); RedisCacheConfiguration cacheConfig = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(ConstantUtil.CACHE_TTL) // 全局 5 分钟过期 @@ -173,11 +169,21 @@ public class CacheConfig { /** 统一构建带类型信息的 Jackson 序列化器(解决泛型/乱码),供 RedisTemplate 复用。 */ private Jackson2JsonRedisSerializer jacksonSerializer() { Jackson2JsonRedisSerializer jackson = new Jackson2JsonRedisSerializer<>(Object.class); - ObjectMapper mapper = new ObjectMapper(); - mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); - mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, - ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); - jackson.setObjectMapper(mapper); + jackson.setObjectMapper(newCacheObjectMapper()); return jackson; } + + /** 构建缓存专用 ObjectMapper:类型信息 + 可见性 + Java 8 时间类型支持。 */ + private ObjectMapper newCacheObjectMapper() { + ObjectMapper mapper = new ObjectMapper(); + // 允许任意字段可见,保证反序列化不依赖 getter/setter + mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + // 记录完整类型信息,保证泛型/多态对象反序列化正常(解决 JDK 序列化乱码、泛型丢失) + mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, + ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); + // 支持 Java 8 时间类型(LocalDateTime 等),否则缓存含时间字段的实体(如 ApplicationInfo.createTime)会序列化失败 + mapper.registerModule(new JavaTimeModule()); + mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + return mapper; + } }