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