在使用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。 選擇哪種方法取決于項目整體的設計和編碼風格。