当前位置: 首页 > 知识库问答 >
问题:

如何在Jackson(2.12.0)和Quarkus(1.11.1)中使用Kotlin(1.4.21)数据类的默认值

艾飞宇
2023-03-14

我正在使用Quarkus 1.11.1和Kotlin 1.4.21以及Jackson 2.12.0。

我不明白为什么当我发送一个POST请求,其中包含一个定义了默认参数的数据类的主体时,这是不被接受的,并且返回一个错误问题:指定为非null的参数是null

在我的pom.xml文件中:

    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-kotlin</artifactId>
        <version>2.12.0</version>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-resteasy-jackson</artifactId>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-jackson</artifactId>
    </dependency>

Quarkus文档说(https://quarkus.io/guides/kotlin#kotlin-和杰克逊):

如果已将com.fasterxml.jackson.module:jackson模块kotlin依赖项和quarkus jackson扩展(或quarkus resteasy扩展)添加到项目中,则quarkus会自动将kotlin模块注册到ObjectMapper bean(有关更多详细信息,请参阅本指南)。

我有一个数据类像:

data class MyAttributes
@BsonCreator  constructor(
    @BsonProperty("myId")
    @JsonProperty("myId")
    var myId: String,
    @BsonProperty("name")
    @JsonProperty("name")
    val name: String,
    @BsonProperty("data")
    @JsonProperty("data", defaultValue = "{}")
    var data: MutableMap<String, Any> = mutableMapOf()
)

我注意到@JsonProperty注释中的defaultValue没有用处,因为它只用于记录期望值(https://fasterxml.github.io/jackson-annotations/javadoc/2.12/com/fasterxml/jackson/annotation/JsonProperty.html#defaultValue--)

如果我发送类似以下内容的JSON:

{
    "myId": "AB123",
    "name": "my attribute name"
}

我得到前面描述的错误,数据栏的默认值被忽略。如果我发送:

{
    "myId": "AB123",
    "name": "my attribute name",
    "data": {}
}

我没有收到错误,因为我还发送了数据字段。

你能告诉我哪里做错了吗?

谢谢

共有1个答案

袁安志
2023-03-14

你有默认的构造函数吗?默认情况下,jackson需要一个默认构造函数。这在数据类中并不常见,所以您可以提供构造函数,也可以这样做:

@Bean
fun objectMapper(): ObjectMapper = ObjectMapper()
                    .registerKotlinModule()
 类似资料:
  • 我在下面试过了,但它们不起作用 我检查了下面的链接:Kotlin等价于Java的字符串[]是什么? https://kotlinlang.org/docs/functions.html

  • 在我的quarkus应用程序中有两个命名的数据源,我们称之为A和B: Quarkus.datasource.a.db-kind=Oracle Quarkus.datasource.b.db-kind=Oracle 因此,每次应用程序启动时,我都会收到这样的通知: 警告:无法确定默认数据源的数据库类型

  • 问题内容: kotlin 1.2.10杰克逊模块kotlin:2.9.0 我在kotlin中有以下数据类: 当我尝试反序列化此数据类时,我得到以下信息: 如您所见,最后两个选项未正确反序列化。通过将注释直接添加到getter @get:JsonProperty,可以解决此问题。但是,根据杰克逊文档,@ JsonProperty应该分配给getters / setters / fields 因此,我

  • 本文向大家介绍如何在MySQL ENUM数据类型中插入默认值?,包括了如何在MySQL ENUM数据类型中插入默认值?的使用技巧和注意事项,需要的朋友参考一下 我们可以借助ENUM数据类型的DEFAULT属性来实现。如果未指定值,则DEFAULT属性会使ENUM数据类型具有默认值。换句话说,我们可以说INSERT语句不必为此字段包含值,因为如果不包含该值,那么将插入DEFAULT之后的值。DEFA

  • kotlin 1.2.10 Jackson-Module-kotlin:2.9.0 根据下面的答案,下面的工作对我来说

  • 本文向大家介绍如何在Java中使用Jackson来获取JSONParser默认设置?,包括了如何在Java中使用Jackson来获取JSONParser默认设置?的使用技巧和注意事项,需要的朋友参考一下 JSON  Parser的 所有默认设置都可以使用JsonParser.Feature枚举来表示。该JsonParser.Feature.values()将返回所有可用的功能JSONParser