如何解决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
相关产品推荐
相关产品推荐

