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

com.auth.java-jwt反序列化包含Kotlin内部对象的Java主对象Claim失败问题

com.auth.java-jwt反序列化包含Kotlin内部对象的Java主对象Claim失败问题

看起来你遇到的问题核心是Jackson没法实例化你的Kotlin data类JsonInfo,从报错信息Cannot construct instance of com.example.JsonInfo (no Creators, like default constructor, exist)就能明确原因:你的Kotlin data类默认只生成带参数的构造函数,而Jackson默认需要无参构造函数或者能识别的Creator来完成反序列化,这就导致解析到JsonUserTokenClaims里的info字段时直接失败了。

下面给你几个不用Lombok的解决方案,按需选择:

方案1:给Kotlin data类添加无参构造函数

Kotlin允许给data类的属性设置默认值来生成无参构造函数,这样Jackson就能正常创建实例了。修改你的JsonInfo类:

data class JsonInfo(
    val id: Int = 0,
    val name: String = ""
)

这种方式最简单,不需要额外依赖,只要调整Kotlin类的属性默认值即可。

方案2:使用Jackson Kotlin模块增强支持

如果你不想给属性加默认值,可以引入Jackson的Kotlin模块,让它更好地适配Kotlin的构造函数。

首先确保项目中引入了jackson-module-kotlin依赖(比如Maven或Gradle),然后可以通过两种方式处理:

方式A:给构造参数添加@JsonProperty注解

明确标记JSON字段和构造参数的映射关系:

import com.fasterxml.jackson.annotation.JsonProperty

data class JsonInfo(
    @JsonProperty("id") val id: Int,
    @JsonProperty("name") val name: String
)

方式B:自行配置ObjectMapper并注册Kotlin模块

既然你提到想修改java-jwt用的ObjectCodec但找不到方法,不如绕开默认实现,自己用配置好的ObjectMapper来反序列化:

// 先把Claim的值转成JSON字符串
String userJson = claims.get("user").asString();

// 初始化配置好的ObjectMapper,注册Kotlin模块
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new KotlinModule());

// 用自己的ObjectMapper完成反序列化
JsonUserTokenClaims userClaims = mapper.readValue(userJson, JsonUserTokenClaims.class);

这种方式更灵活,不仅能解决当前问题,后续如果有其他Kotlin类的反序列化需求也能覆盖。

备注:内容来源于stack exchange,提问作者Clarence the Bard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 08:43:04