com.auth.java-jwt - 使用 java 主对象内的 kotlin 对象反序列化声明

问题描述 投票:0回答:1

我有一个声明对象,它是一个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)
kotlin jwt
1个回答
0
投票

正如评论中提到的,该问题是由 Jackson(JWT 库内部使用)需要一个“创建者”(通常是默认构造函数或用

@JsonCreator
注释的构造函数)引起的,并且构造函数来自您的
data class开箱即用时无法识别 
。 正如您所指出的,您有几种选择:

  1. 通过 Kotlin 模块配置库使用的 Jackson 实例来处理 Kotlin 的主要构造函数 – 我不熟悉这个 JWT 库,但基于它的 JavaDoc,它似乎不允许您配置底层 Jackson 映射器实例
  2. 您可以这样注释您的属性:
    data class JsonInfo(@JsonProperty("id") val id: Int, @JsonProperty("name") val name: String)
    
© www.soinside.com 2019 - 2024. All rights reserved.