反序列化PageImpl时出错:无法构造`org.springframework.data.domain.PageImpl`的实例

时间:2019-05-03 07:58:05

标签: spring-boot spring-cache jackson2 fasterxml spring-data-commons

问题是将Spring缓存与Redis缓存管理器一起使用时,由于没有默认构造函数,因此无法反序列化Spring Pageable响应

使用的Spring Boot版本是2.1.4.RELEASE

使用序列化程序的Redis配置类

spell1 = random.randint(5, 10)
spell2 = random.randint(0, 20)
heal1 = random.randint(5, 10)

bspell1 = random.randint(0, 10)
bspell2 = random.randint(10, 20)
bspell3 = 15
bheal1 = 10
bossturn = (bspell3, bspell2, bspell1, bheal1)

usercasting = input("Cast a Spell, choose between spell1, spell2, heal1: ")

if usercasting == "heal1":
    hp += heal1
    print("You healed yourself by", heal1, "!")
    print(hp)

if usercasting:
    random.choice(bossturn)
    print(random.choice(bossturn))

我正在尝试使用Spring缓存和Redis作为缓存后端在Redis缓存中缓存Spring REST API页面结果响应

PermissionManager

我能够看到使用RedisSerializer.json()序列化器将页面作为JSON缓存在Redis缓存中,但是在下一次调用期间,当从缓存中读取数据时,我得到了以下异常

@Bean
public RedisCacheManager redisCacheManager(LettuceConnectionFactory lettuceConnectionFactory) {
    RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().disableCachingNullValues()
        .serializeValuesWith(
                RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json()));

    redisCacheConfiguration.usePrefix();

    return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(lettuceConnectionFactory)
            .cacheDefaults(redisCacheConfiguration).build();

}

我尝试为PageImpl提供一个自定义序列化程序,然后在Spring'org.springframework.data.domain'包的所有部分中获得了PageRequest实现和Sort实现的异常

必须有一种更好的方法来解决此问题,我想知道在Spring缓存中解决此类问题的最佳方法

这是转移到SPRING BOOT v2后的Jackson错误吗?

2 个答案:

答案 0 :(得分:0)

我暂时通过使用JAVA序列化程序解决了该问题,但想知道如何通过打开JSON值序列化程序来解决此问题

RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().disableCachingNullValues()
        .serializeValuesWith(
                RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.java()));

答案 1 :(得分:0)

您可以使用PageImpl的包装器,然后:

public class PageImpl<T> extends org.springframework.data.domain.PageImpl<T> {

     @JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
     public PageImpl(@JsonProperty("content") List<T> content,
                @JsonProperty("number") int page,
                @JsonProperty("size") int size,
                @JsonProperty("totalElements") long total) {

        super(content, PageRequest.of(page, size), total);
    }
}