gpt4 book ai didi

spring-boot - 对Kotlin原语的Spring验证

转载 作者:行者123 更新时间:2023-12-02 13:40:09 25 4
gpt4 key购买 nike

我已经使用Kotlin 1.4.10创建了simple Spring Boot project
我在项目中有简单的DTO:

data class TestRequest(
@field:NotNull val id: Int,
val optionalId: Int?,
val name: String,
val optionalName: String?,
@field:NotNull val value: Double,
val optionalValue: Double?,
val nested: NestedRequest,
val optionalNested: NestedRequest?
)

data class NestedRequest(
@field:NotNull val nestedId: Long,
val nestedOptionalId: Long?,
val nestedName: String,
val optionalNestedName: String?

)
我想知道,编写Kotlin DTO并验证它们的最佳实践是什么?
  • 从一方面来看,Kotlin允许将字段标记为非空,这似乎便于验证。
  • 另一方面,对于Kotlin数值类型(Int,Long,Double等),它似乎具有默认值,就像Java原语一样,因此对于此类字段(不同于字符串字段),不能检查可空性。

  • 如果我使用@JsonProperty(required = true),则将由Jackson而不是验证程序检查可空性,因此这种方法也不正确。
    结果,我有一个问题-是否完全有验证Kotlin DTO的适当方法?

    最佳答案

    您已经注意到,很难验证kotlin基本类型的可否性,因为它们具有默认值。
    我想说的是,结合使用Jackson(用于原始类型的可空性)和Javax验证(诸如最小值/最大值之类的东西)的组合。
    但是,如果您不想使用Jackson验证,则可以通过将变量的类型设置为可为空但将其注释为@NotNull来验证原始类型。
    例如:

    import javax.validation.Valid
    import javax.validation.constraints.NotNull

    data class MyClass(
    @get:Valid
    @get:NotNull
    val someInt: Int?,
    val someText: String
    )
    现在,由于类型可以为空(在此示例中为 Int?),Jackson不会为 someInt插入默认值,因此 someInt的值将为 null。此后,当验证对象时,由于 someInt的值为null,将引发错误。
    例如,如果我们具有以下 @PostMapping:
        @PostMapping("/test")
    fun testFunction(@RequestBody @Valid data: MyClass) {
    print(data)
    }
    发送带有正文的POST请求:
    {
    "someText": "wow"
    }
    将返回这样的错误:
      "timestamp": "2020-10-02T15:22:53.361+00:00",
    "status": 400,
    "error": "Bad Request",
    "trace": "org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public void main.api.TestPublicController.myObject(main.api.MyClass): [Field error in object 'myClass' on field 'someInt': rejected value [null]; ...

    关于spring-boot - 对Kotlin原语的Spring验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64171230/

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