【问题标题】:Jackson Databind not setting default valueJackson Databind 未设置默认值
【发布时间】:2020-08-12 21:53:37
【问题描述】:

在我的 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" 时,我从上面得到了异常,即使它应该只是将它初始化为一个空列表。 非常感谢任何帮助!

【问题讨论】:

    标签: kotlin jackson quarkus


    【解决方案1】:

    问题是,在脱盐过程中,库 (fasterxml) 使用 null 调用主构造函数:FooDTO("Hello Stackoverflow", 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()
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-29
      • 2017-07-17
      • 2011-09-04
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多