Jackson Databind未设置默认值

问题描述

在我的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 FooDTO(
        override var someStringVar: String,override var someListvariable: List<Int> = emptyList(),): BarDTO

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

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

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

{
    "someStringVar": "Hello Stackoverflow","someListvar": []
}

它工作得很好,但是当我放下"someListvar"时,我从上面得到了一个异常,即使它只是将其初始化为一个空列表也是如此。 任何帮助深表感谢!

解决方法

问题在于,在脱盐过程中,库(fasterxml)使用null:FooDTO("Hello Stackoverflow",null)调用主构造函数。调用最终因someListVariable参数不可为空而异常结束(仅在完全不提供参数的情况下才使用默认值,而在null时不使用默认值)。

解决问题的一种方法是提供一个明确的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()
    }
}

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