zwllxs 2019-01-03 20:16 采纳率: 0%
浏览 3271

spring data jpa, 分页查询加缓存时,PageImpl 无法反序列化

由于想给 findAll(Pageable pageable)加上spring的缓存(spring cache),第一遍查询正常,但是在第二遍以后,从缓存中读取时,无法反序列化,提示没有无参构造,请问这个有解决办法吗?
如下:

@CacheConfig(cacheNames = {"familyUserDao"})
public interface FamilyUserDao extends JpaRepository<FamilyUser,Long> {
    @Override
    @Cacheable(key = "methodName +#p0")
    Page<FamilyUser> findAll(Pageable pageable);
}

调用 :

Page<FamilyUser> familyUserPage = familyUserDao.findAll(pageable);

时,报:

org.springframework.data.redis.serializer.SerializationException: Could not read JSON: Can not construct instance of org.springframework.data.domain.PageImpl: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)
 at [Source: [B@7fae8571; line: 1, column: 46]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of org.springframework.data.domain.PageImpl: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)
 at [Source: [B@7fae8571; line: 1, column: 46]
    at org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer.deserialize(Jackson2JsonRedisSerializer.java:73),

这里其实是反序列化问题,jpa默认是使用PageImpl实现Page,
但是PageImpl并没有无参构造,如下:
图片说明

有办法完美解决吗?
没有C币,一是分享问题,二是只能乞求大家看看有没有好办法啦,多谢啦

  • 写回答

1条回答

  • sessinsong 2019-07-12 09:49
    关注

    redis 序列化、反序列化换成 JdkSerializationRedisSerializer吧, 用jackson 他要求所有的反序列化对象都需要有一个 默认的构造函数。 给一个两个
    对象加无参的构造函数还行。多了工作重复量就太多了。所有我觉得还是换成 JdkSerializationRedisSerializer 快捷。

    主要代码:

      RedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();
    
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashValueSerializer(jdkSerializationRedisSerializer);
            redisTemplate.setValueSerializer(jdkSerializationRedisSerializer);
            redisTemplate.setConnectionFactory(factory);
            redisTemplate.afterPropertiesSet();
    
    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog