Spring 非空验证抛出 HttpMessageNotReadableException 而不是 kotlin 中的 MethodArgumentNotValidException

Eri*_*rik 3 validation rest spring kotlin

我正在使用 Spring 在 Kotlin 中制作简单的应用程序,但我在验证方面遇到了问题。

我有这个实体类:

@Entity
@Table(name = "category")
data class Category(
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        val id: Long?,
        @field:NotNull @field:NotEmpty val name: String)
Run Code Online (Sandbox Code Playgroud)

我的控制器功能如下:

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
fun create(@Valid @RequestBody category: Category): ResponseEntity<Category>
Run Code Online (Sandbox Code Playgroud)

create有一些代码,但与问题无关,我的问题是请求正文验证。如果我发送一个名称字段为空的类别,则会引发异常MethodArgumentNotValidException,但如果我将 null 发送到该字段name,则会引发异常HttpMessageNotReadableException。有谁知道是否可以将 null 传递给标记为 的字段,@NotNull也可以MethodArgumentNotValidException在 Kotlin 中抛出。

Chi*_*Dov 5

所以你的问题是你将 name 字段指定为不可空,默认情况下 kotlin 的 jackson 模块将检查它并在json 映射过程中抛出HttpMessageNotReadableException哪个原因。MissingKotlinParameterException如果您name将归档标记为可空 json 映射将通过并进入 spring 验证阶段,那么@Valid我们将得到MethodArgumentNotValidException

@Entity
@Table(name = "category")
data class Category(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    val id: Long?,
    @field:NotNull @field:NotEmpty val name: String?)
Run Code Online (Sandbox Code Playgroud)