Redis点赞数据存储:Integer类型值导致类型转换异常如何解决?
2025-03-07 21:01:11
Redis数据存储类型转换异常调查和解决方案
在使用Redis存储点赞数据时,经常会遇到类型转换异常java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String。这个问题源于Redis模板的序列化机制与存储数据的类型不匹配。
问题描述:
后端代码称赞用户ID (likeUserID)、大拇指文章ID (likePostID) 并被表扬回答ID (likeAnswerID) 存储到Redis。RedisServiceImpl.java 中的 saveliked2Redis 接收三种方法 String 类型参数,作为类型参数, key 部分,使用 redisTemplate.opsForHash().put 该方法将点赞状态码 Constant.REDIS_LIKE_CODE 存储为 value。然而,Constant.REDIS_LIKE_CODE 是 Integer 类型,而 Redis 默认序列化器的模板 StringRedisSerializer 期望 value 为 String 类型,导致类型转换异常。
代码片段:
RedisServiceImpl.java:
@Override public void saveliked2Redis(String likeUserID, String likePostID, String likeAnswerID) { String key = RedisKeyUtils.getLikedKey(likeUserID, likePostID, likeAnswerID); redisTemplate.opsForHash().put(RedisKeyUtils.MAP_KEY_USER_LIKED, key, Constant.REDIS_LIKE_CODE); }
RedisLikeController.java:
// 点赞 @RequiresAuthentication @RequestMapping("/userLike") public ResponseJson userLike(@RequestBody UserLike userLike) { redisService.saveliked2Redis(userLike.getLikeUserID(), userLike.getLikePostID(), userLike.getLikeAnswerID()); return new ResponseJson(Constant.HTTP_CODE_OK, null, "点赞成功"); }
UserLike.java:
public class UserLike { private Integer id;///主键ID private String likeUserID;//喜欢人ID private String likePostID;///被点赞文章ID private String likeAnswerID;//被点赞回答ID private Integer status = 0;///表扬状态,默认不表扬0 0:未点赞 1:已点赞 ///省略了结构部分 }
跟踪错误信息 StringRedisSerializer 的 serialize 证实了方法 Constant.REDIS_LIKE_CODE 的 Integer 类型不能直接转换为 String 类型。
解决方案:
最直接的解决方案是将 Constant.REDIS_LIKE_CODE 定义为 String 类型,确保 Redis 存储的 value 与序列化器所期望的类型一致,以避免类型转换错误。 另一种方法是修改 redisTemplate 的 value 可以处理序列化器 Integer 类型的序列化器,例如 GenericJackson2JsonRedisSerializer。 选择哪种方法取决于项目的整体设计和编码风格。
以上是Redis点赞数据存储:如何解决Integer类型值导致的类型转换异常?详情请关注图灵教育其他相关文章!
