Jackson Databind 未设置默认值

Jackson Databind not setting default value

在我的 quarkus 应用程序中,我有一个接受 DTO 的端点,其中一个字段具有默认值。当我不发送那个字段时,我仍然得到异常

com.fasterxml.jackson.databind.exc.ValueInstantiationException: Cannot construct instance of
`FooDTO`, problem: Parameter specified as non-null is null: method
io.otherstuff.FooDTO.<init>, parameter someListVariable
at [Source: (io.quarkus.vertx.http.runtime.VertxInputStream); line: 4, column: 1]

class 看起来像这样:

class FooDTO(
        override var someStringVar: String,
        override var someListVariable: List<Int> = emptyList(),
): BarDTO

---------------------------------------------

interface BarDTO {
    var someStringVar: String
    var someListVar: List<Int>
}

现在如果我发送这样的有效负载

{
    "someStringVar": "Hello Whosebug",
    "someListVar": []
}

它工作得很好,但是当我删除 "someListVar" 时,我从上面得到了异常,即使它应该只是将它初始化为一个空列表。 非常感谢任何帮助!

问题是,在脱盐过程中,库 (fasterxml) 使用 null 调用主构造函数:FooDTO("Hello Whosebug", null)。调用以异常结束,因为 someListVariable 参数不可为空(默认值仅在根本未提供参数时使用,而不是在它为空时使用)。

解决该问题的一种选择是提供明确的 JsonCreator:

class FooDTO(
    override var someStringVar: String, 
    override var someListVariable: List<Int> = emptyList()) : BarDTO {

    companion object {
        @JvmStatic 
        @JsonCreator 
        fun of(
            @JsonProperty("someStringVar") someStringVar: String,
            @JsonProperty("someListVariable") someListVariable: List<Int>?) =
            FooDTO(someStringVar, someListVariable ?: emptyList())
    }
}

另一种可能性是使用辅助构造函数而不是默认值:

class FooDTO : BarDTO {

    override var someStringVar: String
    override var someListVariable: List<Int>

    @JsonCreator
    constructor(
        @JsonProperty("someStringVar") someStringVar: String,
        @JsonProperty("someListVariable") someListVariable: List<Int>?) {
        this.someStringVar = someStringVar
        this.someListVariable = someListVariable ?: emptyList()
    }
}

不幸的是,这两个选项都有些冗长。