Validation Kotlin数据类和Bean验证:长字段上的@NotNull无效

Validation Kotlin数据类和Bean验证:长字段上的@NotNull无效,validation,spring-boot,kotlin,Validation,Spring Boot,Kotlin,以下是数据类: data class CreateCommentRequest( @field:NotNull @field:NotEmpty val comment: String, @field:NotNull val postId: Long ) 如果省略注释字段,验证将正常失败 但是如果我没有通过postId,就像这样: { "comment": "hello" } 验证通过 如果postId未

以下是数据类:

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

        @field:NotNull
        val postId: Long
)
如果省略
注释
字段,验证将正常失败

但是如果我没有通过postId,就像这样:

{
    "comment": "hello"
}
验证通过

如果
postId
未通过,如何使验证失败


另外,我使用spring boot 2.0.1和
com.fasterxml.jackson.module:jackson module kotlin
module,kotlin版本:1.2.20

我认为这与此有关

看起来您可以打开
反序列化功能。对于_原语
,在_NULL_上失败,但这不会导致验证错误,但将无法构造对象。您需要适当地处理该异常以生成400错误

如果确实需要验证,则需要允许构造对象,以便验证程序可以运行,这意味着使原语字段为空:

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

    @field:NotNull
    val postId: Long?
)
这似乎与直觉相反,但验证程序在构建对象之前不会运行。它不是jackson(不关心验证注释)或kotlin的一部分。除非您提供了另一种实现,否则是hibernate验证器根据注释执行空检查,并且它需要一个完整的对象才能执行此检查

看起来jackson kotlin模块正在创建对象的实例,但它必须为postId提供一个值,因此它提供了一个默认值0(除非您指示它在null基元上失败)

import com.fasterxml.jackson.databind.ObjectMapper
导入com.fasterxml.jackson.module.kotlin.KotlinModule
数据类测试(valx:Long)
趣味主线(args:Array){
val m=ObjectMapper().registerModule(KotlinModule())
print(m.readValue(“{}”,Test::class.java))//打印测试(x=0)
}

通过使字段可为null,您就允许构造它,以便JSR303验证可以在对象上运行。

实际上,仅为验证而使非null值为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) 
}