Я использую 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
В этот момент я в порядке, если мне нужно написать сериализатордля каждого типа я хочу сохранить или, может быть, я могу создать собственный для всех.Пока что мои исследования не увенчались успехом.
Спасибо за ваше время.