首页 > 解决方案 > 来自 JSON 的 Int 字段的 Kotlin + Spring Boot 默认值

问题描述

我正在用 Kotlin + Spring Boot + Hibernate 编写简单的 CRUD 并提出了这个问题:

我在User类中有一个名为age并输入的字段Int

import javax.persistence.*
import javax.validation.constraints.NotBlank
import javax.validation.constraints.Size

@Entity
@Table(name = "users")
data class User(
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        val id: Long,

        @NotBlank
        @Column(unique = true)
        @Size(min = 1, max = 100)
        val username: String,

        @NotBlank
        @Size(max = 50)
        val firstName: String,

        @Size(max = 50)
        val lastName: String?,

        @Size(min = 1, max = 100)
        val age: Int
)

然后我有创建用户的发布请求

@PostMapping
fun post(@RequestBody user: User): User {
    log.debug("POST: {}", user)
    return userRepository.save(user)
}

问题是,当我错过ageJSON 中的字段时,它不会以 400 错误响应,而是默认为0

如何使此字段成为必填项?

标签: springkotlin

解决方案


我认为更大的问题是您将同一个类(您的实体)用于多种目的。这使得该类非常不灵活,因为您无法使其适应 REST 端点的需求以及 Hibernate 的需求。

相反,我要做的是在两者之间划清界限(类似Clean Architecture会建议这样做):

data class UserDTO(val id: Long?,
        var username: String?,
        var firstName: String?,
        var lastName: String?,
        var age: Int?) {

    fun toUser() = User(
        id = id ?: signalError(),
        username = username ?: signalError(),
        firstName = firstName ?: signalError(),
        lastName = lastName ?: signalError(),
        age = age ?: signalError())

    private fun signalError() : Nothing = throw IllegalArgumentException(
        "Missing parameter in UserDTO.")

}

推荐阅读