Ошибка при десериализации PageImpl: невозможно создать экземпляр `org.springframework.data.domain.PageImpl` - PullRequest
0 голосов
/ 03 мая 2019

Проблема возникает при использовании Spring cache с диспетчером кэширования Redis, который не может десериализировать ответ Spring Pageable из-за отсутствия конструктора по умолчанию

Используется версия весенней загрузки: 2.1.4.RELEASE

RedisКласс config, использующий сериализатор

@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();

}

Я пытаюсь кэшировать ответ результата страницы Spring REST API в кеше Redis, используя кэш Spring и Redis в качестве бэкэнда кэша

@GetMapping
@Cacheable("Article_Response_Page")
public Page<Article> findAll(Pageable pageable) {
    return articleRepository.findAll(pageable);
}

Я могучтобы увидеть, что страница кэшируется как JSON в кэше Redis с использованием сериализатора RedisSerializer.json (), но во время следующего вызова, когда данные читаются из кэша, я получаю следующее исключение

 com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot 
 construct instance of `org.springframework.data.domain.PageImpl` (no 
 Creators, like default construct, exist): cannot deserialize from Object 
 value (no delegate- or property-based Creator)
 at [Source: (byte[])" 
 {"@class":"org.springframework.data.domain.PageImpl","content": 
 ["java.util.Collections$UnmodifiableRandomAccessList",[]],"pageable": 
 {"@class":"org.springframework.data.domain.PageRequest","sort":{"@class":"org.springframework.data.domain.Sort","sorted":false,"unsorted":true,"empty":true},"offset":0,"pageSize":20,"pageNumber":0,"paged":true,"unpaged":false},"totalPages":0,"totalElements":0,"last":true,"size":20,"number":0,"sort":{"@class":"org.springframework.data.domain.Sort","sorted":false,"uns"[truncated 73 bytes]; line: 1, column: 54]
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67) ~[jackson-databind-2.9.8.jar:2.9.8]

Я попытался дать пользовательскийСериализатор для PageImpl, тогда я получил исключение для реализации PageRequest и Сортировки всей части пакета Spring 'org.springframework.data.domain'

Должен быть лучший способ решить эту проблему, и я хотел бы знать лучшееподход к решению этого вопроса в весеннем кэше

Это ошибка Джексона после мОВИНГ к SPRING BOOT v2?

1 Ответ

0 голосов
/ 06 мая 2019

Я исправил проблему с помощью сериализатора JAVA, но хотел бы знать, как это можно исправить с включенным сериализатором значений JSON

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