在@PostMapping调用中,当通过@RequestBody接收到一个对象列表,并且该列表包含Int或Double变量时,如果这些变量没有在请求主体json中发送,则这些变量将自初始化为0。相反,我理解它应该返回错误的请求
例如,使用BigDecimal时不会发生此问题,并且返回带有此变量的错误请求,或者如果请求的主体是对象而不是列表,则不会发生此问题。
你知道怎么解决这个吗?是Spring问题吗?
重现问题的示例:
data class Animal(
val name: String,
val height: Double
)
@PostMapping("/animals")
suspend fun saveAnimals(
@RequestBody request: List<Animal>
): ResponseEntity<Any> {
println(request[0].height)
return ResponseEntity.ok().build()
}
在上面的例子中,如果请求中没有发送高度,打印结果将为0,但我希望这会返回一个错误的请求。
3条答案
按热度按时间twh00eeo1#
必须将DTO声明为
val height: Double
在JVM
中被转换成基元double
,如果没有定义基元0.0
,则基元double
具有初始值。然而,
val height: Double?
在JVM
中被翻译成装箱类型Double
,如果null
未被定义,则装箱类型Double
具有初始值。2skhul332#
因为Kotlin不像Java那样使用原语和 Package 对象。
int
和Integer
在Java中。如果Kotlin可以优化,那么它会这样做。所以这个Double
在编译版本中将是double
。Ofc,如果你调用 Package 器方法,使用任何遗传(例如List),或者属性在你的代码中是nullable类型,Kotlin不会改变为原始double。总之:基元双精度浮点数的默认值为
0.0
来自
data class Animal
的IDEA Java代码示例:tct7dpnv3#
除了我的另一个答案,另一个概念:
为什么不通过列表进行验证:https://stackoverflow.com/a/35643761/2625393
使用以下内容:
第一个