Как хранить нетипизированные файлы JSON в Redis с помощью Spring Boot 2 CacheManager - PullRequest
1 голос
/ 17 июня 2019

Я использую Redis в качестве кеш-хранилища в приложении Spring Boot 2.Я использую аннотацию @Cacheable в некоторых методах и хочу сохранить данные в Redis как нетипизированные файлы JSON.С моей текущей конфигурацией сохранение данных работает нормально, но при чтении они генерируют ClassCastException.

Все решения, ответы, примеры и учебные пособия используют ObjectMapper Джексона для настройки RedisTemplate или RedisCacheConfigurationдобавив атрибут ввода по умолчанию в JSON.Дело в том, что этот кеш будет использоваться разными приложениями на разных языках / технологиях, и я не могу заставить остальные приложения работать так же, как Spring Boot.

Вот что у меня сейчас есть:

Конфиг

@Bean
CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
    return RedisCacheManagerBuilder.fromConnectionFactory(connectionFactory)
            .cacheDefaults(cacheConfiguration())
            .build();
}

private RedisCacheConfiguration cacheConfiguration() {
    return RedisCacheConfiguration.defaultCacheConfig()
            .disableCachingNullValues()
            .serializeKeysWith(SerializationPair.fromSerializer(RedisSerializer.string()))
            .serializeValuesWith(SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer(redisMapper())));
}

private ObjectMapper redisMapper() {
    return new ObjectMapper()
                //.enableDefaultTyping(DefaultTyping.NON_FINAL, As.PROPERTY)
                .setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
}

Сервис

@Cacheable(key = "'persons::' + #id")
public Person getPerson(Long id) {
    // return person from DB
}

Результат с текущей конфигурацией:

{
  "name": "John",
  "lastName": "Doe",
  "age": 31
}

Когда Spring пытается прочитать содержимое изкэшировать, используя десериализаторы, он не находит атрибут "@class" с информацией о типе, поэтому возвращает LinkedHashMap.После этого CacheInterceptor пытается преобразовать LinkedHashMap в Person, и наступает момент, когда ClassCastException происходит.

Request processing failed; nested exception is java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.test.dto.Person

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

Спасибо за ваше время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...