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()
}
}
不幸的是,这两个选项都有些冗长。
在我的 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()
}
}
不幸的是,这两个选项都有些冗长。