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

无法在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 13:07:47