使用springboot中的@Cacheable报错类转换异常class java.util.LinkedHashMap cannot be cast to class

因为在缓存管理器中配置的是使用 Jackson2JsonRedisSerializer 对象作为值的序列化器。

   @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        RedisSerializer<String> strSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jacksonSeial =
                new Jackson2JsonRedisSerializer(Object.class);
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofDays(1))
                .serializeKeysWith(RedisSerializationContext.SerializationPair
                        .fromSerializer(strSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair
                        .fromSerializer(jacksonSeial))
                .disableCachingNullValues();
        RedisCacheManager cacheManager = RedisCacheManager
                .builder(redisConnectionFactory).cacheDefaults(config).build();
        return cacheManager;
                
    }

        Jackson 反序列化过程通常会生成一个 LinkedHashMap 的实例来表示 JSON 数据的键值对结构,特别是当 Jackson 没有具体的类型信息来实例化特定的对象类型时。

所以在业务层中把持久层访问的对象转为LinkedHashMap 类型即可。

    @Cacheable(cacheNames = "comment",unless = "#result==null")
    public Comment findById(int comment_id){
        ObjectMapper mapper = new ObjectMapper();
        // 获得类型工厂 指定了要构造的 Map 的类型以及键和值的类型。
        MapType mapType = mapper.getTypeFactory().constructMapType(LinkedHashMap.class, String.class, Object.class);
        
        Optional<Comment> optional = commentRepository.findById(comment_id);
        System.out.println("optional = " + optional);
        if(optional.isPresent()){
            return mapper.convertValue(optional.get(),mapType);
        }
        return null;
    }

  • 18
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值