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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:36:03