Шаблон Redis для реактивного хэша Spring Data для настраиваемых объектов
Я пытался использовать Jackson2JsonRedisSerializer
для сериализации настраиваемого экземпляра в качестве хеш-значения в магазине Redis. Кажется, что хотя я правильно создал шаблон, хеш не создается.
Просто примечание, что я использую spring-data-reactive-redis
с spring-webflux
с Котлином.
data class Movie(
@get:JsonProperty("Id")
val id: String?,
@get:JsonProperty("Title")
val title: String,
)
@Configuration
class RedisConfig {
@Bean
fun hashTemplate(factory: ReactiveRedisConnectionFactory): ReactiveRedisTemplate<String, Movie> {
val serializationContext = RedisSerializationContext.newSerializationContext<String, Movie>(StringRedisSerializer())
.hashKey(StringRedisSerializer())
.hashValue(Jackson2JsonRedisSerializer(Movie::class.java))
.build()
return ReactiveRedisTemplate(factory, context)
}
}
Вот пример добавления данных с помощью этого шаблона.
@Component
class DataLoader(@Qualifier("hashTemplate") private val template: ReactiveRedisTemplate<String, Movie>) {
@PostConstruct
fun loadData() {
Flux.fromIterable(
listOf(Movie("1", "Avengers: Endgame"), Movie("2", "Black Widow"))
)
.flatMap { movie ->
template.opsForHash<String, Movie>().put("Movies", movie.id, movie)
}
.thenMany(template.opsForHash<String, Movie>().entries("Movies"))
.subscribe { m -> println(m) }
}
}
Может ли кто-нибудь помочь мне понять, почему Spring не использует созданный мной шаблон.
1 ответ
Проблема может быть в том, что Джексон не может работать с объектами Kotlin. Добавьте jackson-module-kotlin в свои зависимости и объявите сериализатор таким образом.
val valueSerializer = Jackson2JsonRedisSerializer(jacksonObjectMapper(),Movie::class.java)
val serializationContext = RedisSerializationContext.newSerializationContext<String, Movie>(StringRedisSerializer())
.key(StringRedisSerializer())
.value(valueSerializer)
.hashKey(StringRedisSerializer())
.hashValue(valueSerializer)
.build()