在使用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。 选择哪种方法取决于项目整体的设计和编码风格。