首页 > 图灵资讯 > 技术篇>正文

Redis点赞数据存储:Integer类型值导致类型转换异常如何解决?

2025-03-07 21:01:11

redis点赞数据存储:integer类型值导致类型转换异常如何解决?

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类型值导致的类型转换异常?详情请关注图灵教育其他相关文章!

上一篇 IDEA导入Spring Framework 4.1.x源码报错401:如何解决依赖无法解析的问题?
下一篇 返回列表

文章素材均来源于网络,如有侵权,请联系管理员删除。