【发布时间】:2021-11-17 11:07:44
【问题描述】:
我是使用 Kotlin 的 Spring Boot 的新手,我正在尝试在后台使用 MySQL 数据库实现一个简单的 REST API。我首先创建了一个带有“TestEntityRepository”、“TestEntityResource”和“TestEntityService”的“TestEntity”类。到目前为止一切正常。我能够通过 REST API 发布和获取数据。
之后,我创建了另一个实体“用户”,我想为它做与我的 TestEntity 相同的操作。我创建了包含更多字段的类,然后是 Repository、Resource 和 Service 类。现在,当我尝试向我的 UserResource REST 端点发布一个新条目时,我收到一个 400 Bad Request 错误,并显示以下消息:
字段“id”上的对象“用户”中的字段错误:拒绝值 [null];代码 [typeMismatch.user.id,typeMismatch.id,typeMismatch.long,typeMismatch];参数 [org.springframework.context.support.DefaultMessageSourceResolvable: 代码 [user.id,id];论据 [];默认消息 [id]];默认消息 [无法将“null”类型的值转换为所需的“long”类型;嵌套异常是 org.springframework.core.convert.ConversionFailedException: 无法从类型 [null] 转换为类型 [@javax.persistence.Id @javax.persistence.GeneratedValue long] 的值'null';嵌套异常是 java.lang.IllegalArgumentException: A null value cannot be assigned to an original type]]
我的用户类如下所示:
@Entity
class User(
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
val id: Long,
@Column(name = "login_id", unique = true, nullable = false)
val loginId: String,
@Column(name = "display_name")
val displayName: String,
@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "created_date")
val createdDate: Date,
@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "modify_date")
val modifyDate: Date
)
存储库类如下所示:
@Repository
interface UserRepository: JpaRepository<User, Long>
这样的服务类:
@Service
class UserService(val repo: UserRepository) {
fun findAll(): List<User> = repo.findAll()
fun findById(userId: Long): User = repo.findById(userId)
.orElseThrow { ResponseStatusException(HttpStatus.NOT_FOUND, "No user was found with this ID.") }
fun post(user: User) {
repo.save(user)
}
fun delete(user: User) {
repo.delete(user)
}
}
最后我的资源类(RestController)是这样的:
@RestController
class UserResource(val service: UserService) {
@GetMapping("/user")
fun get(): List<User> = service.findAll()
@GetMapping("/user/{id}")
fun get(@PathVariable(name = "id") id: Long): User = service.findById(id)
@PostMapping("/user")
fun post(user: User) {
service.post(user)
}
@DeleteMapping("/user")
fun delete(user: User) = service.delete(user)
}
有人可能知道出了什么问题吗?我只是发送一个包含“loginId”和“displayName”字段的 JSON 对象的 HTTP POST。 “id”字段应该自动填写,但它不起作用。此外,当我在我的 JSON 中添加一个名为“id”的字段时,请求将不会被接受。
谢谢!
【问题讨论】:
标签: spring spring-boot rest kotlin