Spring Boot整合MySQL时GET正常POST请求报错如何解决
问题根因
报错java.sql.SQLIntegrityConstraintViolationException: Column 'booking_name' cannot be null的直接原因是:执行插入操作时,实体类Bookings的bookingName属性值为null,违反了数据库表booking_name字段的非空约束。
本质是参数绑定失败:你的POST接口方法没有给入参添加@RequestBody注解,Spring MVC默认会按照表单参数、URL查询参数的规则解析入参,不会主动解析请求体中的JSON数据。你发起POST请求时通常是将预订数据放在JSON请求体中传输,因此所有字段都没有完成绑定,其中字符串类型的bookingName默认值为null,最终触发数据库报错。
GET请求可以正常响应是因为查询流程是JPA从数据库读取数据,自动将下划线命名的表字段映射到驼峰命名的实体属性,不存在参数绑定的问题。
修复方案
- 第一步:修改
BookingsController类中的POST接口方法,给Bookings入参添加@RequestBody注解,同时补上对应类的导入,修改后代码如下:
// 新增导入 import org.springframework.web.bind.annotation.RequestBody; @PostMapping("/bookings") public void addBookings(@RequestBody Bookings bookings) { bs.addBookings(bookings); }
- 第二步:确认项目已正常引入
spring-boot-starter-web依赖,该依赖默认集成Jackson序列化组件,会自动完成JSON字段和实体驼峰属性的绑定,不需要额外添加字段映射配置。 - 第三步:发起POST请求时设置请求头
Content-Type: application/json,请求体传递符合实体结构的JSON数据,示例如下:
{ "bookingId": 1, "bookingName": "测试预订人", "bookingPid": 2001, "passengers": 3, "cost": 960 }
验证方式
修改完成后重启项目,重新发起POST请求即可正常完成数据插入,不会再出现booking_name为空的报错。
内容的提问来源于stack exchange,提问作者vishvak
相关产品推荐
相关产品推荐

