需要对象序列化报错:Failed to serialize object using DefaultSerializer

最近在做一个项目。
构建了分页查询,并且设置Redis缓存。
但是当我执行查询却报错

2023-03-23 15:29:14,610 ERROR [http-nio-63042-exec-8][GlobalExceptionHandler.java:36] - 【系统异常】Cannot serialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer; nested exception is java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [com.mes.base.model.PageResult]
org.springframework.data.redis.serializer.SerializationException: Cannot serialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer; nested exception is java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [com.mes.base.model.PageResult]

仔细检查才知道,我的Service层中的方法,有将数据存入Redis的操作,也有从Redis缓存中变成对象的操作,这就说明需要将PageResult添加序列化接口。

    @Override
    public PageResult<OrderMas> queryOrderMasList(PageParams pageParams, String orderNo) {
        String cacheKey = "orderMas:" + pageParams.getPageNo() + ":" + pageParams.getPageSize() + ":" + orderNo;
        ValueOperations<String, Object> valueOps = redisTemplate.opsForValue();
        PageResult<OrderMas> result;
        // 判断缓存是否存在
        if (redisTemplate.hasKey(cacheKey)) {
            result = (PageResult<OrderMas>) valueOps.get(cacheKey);
        } else {
            LambdaQueryWrapper<OrderMas> queryWrapper = new LambdaQueryWrapper<>();
            // 当 orderNo 不为空时,添加查询条件
            if (StringUtils.isNotEmpty(orderNo)) {
                queryWrapper.eq(OrderMas::getOrderNo, orderNo);
            }
            // 创建分页对象
            Page<OrderMas> page = new Page<>(pageParams.getPageNo(), pageParams.getPageSize());
            // 查询数据内容获得结果
            Page<OrderMas> pageResult = orderMasMapper.selectPage(page, queryWrapper);
            // 获取数据列表(获取当页记录)
            List<OrderMas> list = pageResult.getRecords();
            // 获取数据总数
            long total = pageResult.getTotal();
            result = new PageResult<>(list, total, pageParams.getPageNo(), pageParams.getPageSize());
            // 将结果写入缓存
            valueOps.set(cacheKey, result);
        }
        return result;
    }

其中存入写入缓存:

// 将结果写入缓存
valueOps.set(cacheKey, result);

获取缓存结果时,需要反序列化:

result = (PageResult<OrderMas>) valueOps.get(cacheKey);

因此,解决方法:

public class PageResult<T> implements Serializable

直接添加序列化接口。

为了使 RedisTemplate 能够正确地在 Redis 中存储和检索 PageResult 对象,您需要让 PageResult 类实现 Serializable 接口。这样,RedisTemplate 就可以使用 Java 序列化机制在 Redis 中存储和检索 PageResult 对象了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值