Spring boot 在Kotlin中使用Jackson2JsonRedisSerializer的通用RedisTemplate

Spring boot 在Kotlin中使用Jackson2JsonRedisSerializer的通用RedisTemplate,spring-boot,kotlin,redis,jackson,spring-data-redis,Spring Boot,Kotlin,Redis,Jackson,Spring Data Redis,我的控制器使用redis模板从redis获取和设置数据 java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class com.noicesoftware.redis.model.Game (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; com.noicesoftware.redis.model.Ga

我的控制器使用redis模板从redis获取和设置数据

java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class com.noicesoftware.redis.model.Game (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; com.noicesoftware.redis.model.Game is in unnamed module of loader 'app')
val redisTemplate:redisTemplate

模板是使用bean注入的

@Bean
fun <T> redisTemplate(builder: RestTemplateBuilder): RedisTemplate<String, T> {
    val serializer = Jackson2JsonRedisSerializer(Game::class.java)
    serializer.setObjectMapper(objectMapper)

    val template = RedisTemplate<String, T>()
    template.setConnectionFactory(connectionFactory())
    template.setDefaultSerializer(serializer)
    return template
}
我已尝试将其更改为以下内容

val serializer = Jackson2JsonRedisSerializer(Object::class.java)
这可以编译,但我在从redis读取时遇到异常

java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class com.noicesoftware.redis.model.Game (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; com.noicesoftware.redis.model.Game is in unnamed module of loader 'app')
我尝试过使用GenericJackson2JsonRedisSerializer,但得到的行为和异常如上所述

val serializer = GenericJackson2JsonRedisSerializer(objectMapper)

任何想法都将不胜感激。完整代码可在此处获得

我还没能找到一个让bean保持通用性的解决方案。如果我使类型具体化,那么我还必须使函数内联,然后是private或final。这会导致运行时错误。我的解决方案是将泛型代码移动到私有内联函数中,然后为我想要的每种模板类型声明一个bean。不像我希望的那么整洁,但我想也不算太糟

private inline fun <reified T> getRedisTemplate(): RedisTemplate<String, T> {
    val serializer = Jackson2JsonRedisSerializer(T::class.java)
    serializer.setObjectMapper(objectMapper)

    val template = RedisTemplate<String, T>()
    template.setConnectionFactory(connectionFactory())
    template.setDefaultSerializer(serializer)
    return template
}

@Bean
fun redisTemplate(): RedisTemplate<String, Game> = getRedisTemplate()
私有内联函数getRedisTemplate():RedisTemplate{ val serializer=jackson2json重新序列化程序(T::class.java) serializer.setObjectMapper(objectMapper) val template=RedisTemplate() template.setConnectionFactory(connectionFactory()) template.setDefaultSerializer(序列化程序) 返回模板 } @豆子 fun redisTemplate():redisTemplate=getRedisTemplate()