gpt4 book ai didi

validation - Kotlin 数据类和 Bean 验证 : @NotNull on Long fields does not work

转载 作者:行者123 更新时间:2023-12-02 12:18:27 27 4
gpt4 key购买 nike

这是数据类:

data class CreateCommentRequest(
@field:NotNull
@field:NotEmpty
val comment: String,

@field:NotNull
val postId: Long
)

如果我省略 comment字段,验证正确失败。

但是如果我不通过 postId , 像这样:
{
"comment": "hello"
}

验证通过。

如果 postId,如何使验证失败是不是通过了?

附言我使用带有 com.fasterxml.jackson.module:jackson-module-kotlin 的 spring boot 2.0.1模块,kotlin 版本:1.2.20

最佳答案

我认为这与 https://github.com/FasterXML/jackson-module-kotlin/issues/130 有关.

看来你可以打开DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES ,但这不会导致验证错误,但会无法构造对象。您需要适本地处理该异常以生成 400 错误。

如果您真的想要验证,则需要允许构造对象,以便验证器可以运行,这意味着使原始字段可以为空:

data class CreateCommentRequest(
@field:NotNull
@field:NotEmpty
val comment: String,

@field:NotNull
val postId: Long?
)

这可能看起来违反直觉,但验证器在对象构建之前不会运行。它不是 jackson (它不关心验证注释)或 kotlin 的一部分。除非您提供了替代实现,否则休眠验证器会根据注释进行空值检查,并且它需要一个完整的对象才能执行此检查。

看起来 jackson kotlin 模块正在创建对象的实例,但它必须为 postId 提供一个值,因此它提供了一个默认值 0(除非您指示它在 null 原语上失败)。
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.KotlinModule

data class Test(val x : Long)

fun main(args : Array<String>) {
val m = ObjectMapper().registerModule(KotlinModule())
print(m.readValue("{}", Test::class.java)) // prints Test(x=0)
}

通过使该字段可以为空,您可以构造它,以便 JSR 303 验证可以在对象上运行。

关于validation - Kotlin 数据类和 Bean 验证 : @NotNull on Long fields does not work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49896933/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com