Kotlin搭配Redisson使用JsonJackson序列化未自动生成@class标识问题
问题修复方案
核心原因
Kotlin类默认是final类型,Redisson内置的Jackson序列化配置默认仅对非final类型自动添加@class类型标识字段,而你用到的UserProfile接口的实现类在Kotlin中默认是final的,因此触发该问题。
方案1:修改Jackson全局配置(推荐,无需修改业务类)
自定义Redisson的Jackson序列化配置,强制开启所有类型的类型标识写入,代码示例如下:
val config = Config() // 自定义Jackson序列化器 val jacksonSerializer = JacksonJsonSerializer() jacksonSerializer.objectMapper.apply { // 强制对所有类型启用类型标识,使用@class字段 activateDefaultTyping( polymorphicTypeValidator, ObjectMapper.DefaultTyping.EVERYTHING, JsonTypeInfo.As.PROPERTY ) // 注册Kotlin模块,避免数据类、空安全相关序列化异常 registerModule(KotlinModule.Builder().build()) } // 配置Redisson使用自定义序列化器 config.codec = JsonJacksonCodec(jacksonSerializer.objectMapper) // 后续正常创建RedissonClient即可 val redissonClient = Redisson.create(config)
如果项目未引入jackson-module-kotlin依赖,需要先补充引入避免Kotlin特有类型序列化异常。
方案2:给目标类显式加类型注解
如果仅需要对UserProfile相关的实现类加类型标识,可以直接在接口上添加Jackson注解:
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class") interface UserProfile
所有实现该接口的类序列化时都会自动带上@class字段,无需修改全局配置。
方案3:修改实现类为非final
如果你的实现类允许继承,给UserProfile的实现类加open修饰符,Redisson默认的Jackson配置就会自动识别非final类型并添加@class字段。
open class UserProfileImpl( // 类属性定义 ) : UserProfile
验证方式:序列化后打印JSON字符串,确认存在
@class字段且值为实现类的全限定类名即可。
内容的提问来源于stack exchange,提问作者Simon Mitchell
相关产品推荐
相关产品推荐

