You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot Kotlin REST API新增User时id字段类型不匹配400错误求助

问题根源

你的错误是两个配置问题共同导致的:

  1. User实体类的id字段定义为不可为空的Long类型,且没有设置默认值
    POST请求没有传id参数时,反序列化框架会尝试给id赋值null,但不可为空的Long类型无法接收null值,直接触发类型转换错误。另外createdDate、modifyDate字段同样存在不可为空、无默认值的问题,即使修复了id的问题也会触发同样的报错。
  2. POST接口的参数没有添加@RequestBody注解
    Spring MVC默认会把接口参数当作表单参数解析,你传的是JSON格式的请求体,不加该注解根本无法正确完成JSON到User对象的反序列化。

修复步骤

1. 调整User实体类的字段定义

给所有自动生成的字段设置默认值null,同时声明为可空类型,Kotlin会自动为全参数带默认值的类生成无参构造,也满足JPA的要求:

@Entity
class User(
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    val id: Long? = null,

    @Column(name = "login_id", unique = true, nullable = false)
    val loginId: String = "",

    @Column(name = "display_name")
    val displayName: String? = null,

    @CreationTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "created_date")
    val createdDate: Date? = null,

    @UpdateTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "modify_date")
    val modifyDate: Date? = null
)

2. 给POST接口参数添加@RequestBody注解

修改UserResource类的post方法:

@PostMapping("/user")
fun post(@RequestBody user: User) {
    service.post(user)
}

如果你的Delete接口也是通过JSON传参,同样需要给参数添加@RequestBody注解,更推荐你按照REST规范调整为按ID删除:

@DeleteMapping("/user/{id}")
fun delete(@PathVariable id: Long) {
    service.delete(service.findById(id))
}

可选优化

不要直接将数据库实体类作为接口入参,单独定义DTO类接收请求参数,既可以避免暴露实体类的内部字段,也可以减少接口和数据层的耦合,后续修改字段不会互相影响。
你之前的TestEntity可以正常运行,大概率是它的字段都设置了默认值、且接口参数添加了@RequestBody注解,对比两个实体的代码就能确认差异。

内容的提问来源于stack exchange,提问作者J B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:06:02