我有一个声明对象,它是一个java对象(JsonUserTokenClaims就是例子),它内部是一个kotlin对象。我正在尝试像这样反序列化对象:
claims.get("user").as(JsonUserTokenClaims.class)
但是自从我在主 java 类中添加了 kotlin 类 JsonInfo 后,我收到了此错误:
com.auth0.jwt.exceptions.JWTDecodeException: Couldn't map the Claim value to JsonUserTokenClaims
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.example.JsonInfo` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: UNKNOWN; byte offset: #UNKNOWN] (through reference chain: com.example.JsonUserTokenClaims["info"])
我正在运行最新版本的 com.auth/java-jwt
简单的解决方案是修改/更改 java-jwt 使用的 ObjectCodec,但我似乎找不到如何做到这一点。如果这个解决方案可行的话。
编辑:更好地了解课程的样子
我见过几个地方,解决方案可能是一些 Lombok 注释,但如果可以的话,我想避免使用这个库
JsonUserTokenClaims
private Integer id;
private JsonInfo info;
public Integer getId() {
return id;
}
public void setId(
final Integer id) {
this.id = id;
}
public JsonInfo getInfo() {
return info;
}
public void setInfo(
final JsonInfo info) {
this.info = info;
}
JsonInfo
data class JsonInfo(val id: Int, val name: String)
正如评论中提到的,该问题是由 Jackson(JWT 库内部使用)需要一个“创建者”(通常是默认构造函数或用
@JsonCreator
注释的构造函数)引起的,并且构造函数来自您的 data class
开箱即用时无法识别
。
正如您所指出的,您有几种选择:
data class JsonInfo(@JsonProperty("id") val id: Int, @JsonProperty("name") val name: String)