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
相关产品推荐
相关产品推荐

