You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Jackson2JsonRedisSerializer使用泛型Map<String,String>的报错问题?

问题解决:Jackson2JsonRedisSerializer泛型Map初始化报错

直接传Map::class.java无法保留Map<String, String>的泛型类型信息,这是导致报错的核心原因——Java/Kotlin的类型擦除会丢失泛型参数,Jackson无法识别具体的键值类型。

解决方法

使用Jackson的TypeReference来捕获完整的泛型类型,修改序列化器的初始化逻辑:

@Configuration
class RedisConfiguration {

    @Bean
    fun redisOperations(factory: ReactiveRedisConnectionFactory): ReactiveRedisOperations<String, Map<String, String>> {
        val keySerializer = StringRedisSerializer()
        // 改用TypeReference指定完整泛型类型
        val valueSerializer = Jackson2JsonRedisSerializer<Map<String, String>>(object : TypeReference<Map<String, String>>() {})
        val builder = RedisSerializationContext.newSerializationContext<String, Map<String, String>>(keySerializer)
        val context = builder.value(valueSerializer).build()
        return ReactiveRedisTemplate(factory, context)
    }
}

原理说明

TypeReference是Jackson提供的工具类,通过匿名内部类的方式可以在运行时保留泛型类型信息,让Jackson2JsonRedisSerializer明确知道要序列化/反序列化的是String键、String值的Map,而非原始的无泛型Map。

如果你的Spring Data Redis版本较新,也可以用另一种写法,通过setType方法指定类型:

val valueSerializer = Jackson2JsonRedisSerializer<Map<String, String>>(Map::class.java)
valueSerializer.setType(object : TypeReference<Map<String, String>>() {})

两种写法效果一致,选自己习惯的即可。

内容的提问来源于stack exchange,提问作者nicholasnet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 10:12:11