无法在Redis中存储/检索Spring HATEOAS EntityModel的解决方法咨询
解决Spring Cache + Redis无法存储/检索EntityModel的问题
以下是针对性的修复步骤:
1. 修复JSON序列化/反序列化问题
默认的RedisSerializer.json()未指定泛型类型,无法正确处理EntityModel<PerformanceSummary>这类泛型对象,导致序列化或反序列化失败。需要配置支持泛型的Jackson序列化器:
修改dayCacheManager的配置:
@Bean public RedisCacheManager dayCacheManager(RedisConnectionFactory redisConnectionFactory) { // 配置ObjectMapper,添加类型信息以支持泛型反序列化 ObjectMapper objectMapper = new ObjectMapper(); // 注册Java8时间模块(如果实体包含LocalDateTime等类型) objectMapper.registerModule(new JavaTimeModule()); // 开启类型信息存储,让Jackson能识别泛型类型 objectMapper.activateDefaultTyping( LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY ); // 创建支持泛型的Jackson序列化器 Jackson2JsonRedisSerializer<Object> valueSerializer = new Jackson2JsonRedisSerializer<>(Object.class); valueSerializer.setObjectMapper(objectMapper); RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(valueSerializer)) .entryTtl(Duration.ofHours(10)); // 使用RedisCacheWriter默认实现 RedisCacheWriter cacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory); return new CustomCacheManager(cacheWriter, redisCacheConfiguration); // 如果CustomCacheManager无特殊需求,也可以替换为: // return RedisCacheManager.builder(cacheWriter).cacheDefaults(redisCacheConfiguration).build(); }
2. 简化缓存Key表达式
当前key = "{#unitList}"会生成带大括号的Key,可能导致Key格式不规范或匹配问题。直接使用参数作为Key即可:
@Cacheable(value = "cachename", cacheManager = "dayCacheManager", key = "#unitList") public EntityModel<PerformanceSummary> getWeekPerformanceSummary(String unitList) { // 业务逻辑 }
3. 检查实体类的可序列化性
确保PerformanceSummary满足Jackson序列化要求:
- 有无参构造函数(Jackson默认需要)
- 字段提供getter/setter方法(或配置Jackson访问私有字段)
- 若包含日期、枚举等特殊类型,确保已正确注册对应的序列化模块(如上述的
JavaTimeModule)
4. 验证CustomCacheManager的正确性
如果CustomCacheManager有自定义逻辑,需确保:
- 正确继承
RedisCacheManager - 构造函数正确传递
RedisCacheWriter和默认配置 - 未覆盖
createRedisCache等核心方法导致序列化配置失效
内容的提问来源于stack exchange,提问作者Abhilash
相关产品推荐
相关产品推荐

