spring - 来自 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)
}
问题是,当我错过age
JSON 中的字段时,它不会以 400 错误响应,而是默认为0
。
如何使此字段成为必填项?
解决方案
我认为更大的问题是您将同一个类(您的实体)用于多种目的。这使得该类非常不灵活,因为您无法使其适应 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.")
}
推荐阅读
- mobile - Google Charts - 如何让图例在移动设备上折叠
- asp.net - 如何在 localhost 上模拟 tcp 连接丢失
- python - 将抓取的数据写入 csv 文件
- postgresql - 将字符串数组转换为整数数组
- python - 菜单分隔符不显示
- java - 如何在 Activity 而不是单独的类中实现 WorkManager,以便可以使用 Activity 变量?
- java - 转换汉字和 UTF-8
- javascript - 我如何验证用户是否在 localStorage 中有令牌
- python - Python:使用 Image PIL 显示图像返回黑色方块
- python - Python:为什么在临时禁止后会打印两次警告?