Шаблон 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()
        
Другие вопросы по тегам