Spring Boot Kotlin REST API新增User时id字段类型不匹配400错误求助
问题根源
你的错误是两个配置问题共同导致的:
- User实体类的
id字段定义为不可为空的Long类型,且没有设置默认值
POST请求没有传id参数时,反序列化框架会尝试给id赋值null,但不可为空的Long类型无法接收null值,直接触发类型转换错误。另外createdDate、modifyDate字段同样存在不可为空、无默认值的问题,即使修复了id的问题也会触发同样的报错。 - 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
相关产品推荐
相关产品推荐

