最近在做一个项目。
构建了分页查询,并且设置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 对象了。