现象
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.18.1</version>
</dependency>
Redis缓存数据,使用GenericJackson2JsonRedisSerializer
作为value和hash value的序列化器。
使用如下方式存储哈希对象:
List<Article> articles = articleMapper.selectList(null);
Map<String, Long> viewCountMap = articles.stream()
.collect(Collectors.toMap(article -> article.getId().toString(), Article::getViewCount));
redisTemplate.opsForHash().putAll("article:viewCount", viewCountMap);
当需要从中取出数据时,如果viewCountMap的Long
类型的value数值大小可以被Integer
所存储,反序列化的数据会变成Integer
类型:
BoundHashOperations<String, String, Long> boundHashOps = redisTemplate.boundHashOps("article:viewCount");
Map<String, Long> viewCountMap = boundHashOps.entries();
assert viewCountMap != null;
List<Article> articleList = viewCountMap.entrySet()
.stream()
.map(entry -> new Article(Long.valueOf(entry.getKey()),
entry.getValue()))
.toList();
呈现出来的现象就是:对Map进行 JSON 序列化,其中值中包含Long
类型的数据,反序列化后强转Long
时报了类型转换异常。
java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.Long (java.lang.Integer and java.lang.Long are in module java.base of loader ‘bootstrap’)