SpringBoot POST新增Customer接口报first_name非空约束错误
问题根因
从报错信息可以看到插入的记录只有email字段有值,serial_number是long类型默认值0,first_name/last_name/mobile_number全为null,核心原因是JSON反序列化字段映射失败:
- 测试时传入的请求体用的是下划线命名格式(
first_name/last_name/serial_number/mobile_number),但Spring默认集成的Jackson反序列化规则是按Java属性的驼峰名做精确匹配,Customer实体类对应属性是驼峰命名(firstName/lastName/serialNumber/mobileNumber),既没有配置全局下划线转驼峰规则,也没有给字段加注解指定映射的JSON字段名,导致这些名字不匹配的字段无法被赋值,只有属性名和传参名完全一致的email字段成功注入了值。 - 贴出的接口代码中
cutomerRepository存在拼写错误(正确应为customerRepository),如果实际代码中存在该笔误会直接导致编译失败,可自行核对。
解决方案
三选一即可,根据项目实际命名规范选择:
- 方案1(无需改代码,快速验证):直接修改Postman请求体的字段名,和实体类驼峰属性保持一致,请求体示例:
{ "serialNumber": 1001, "firstName": "张", "lastName": "三", "email": "tttt@gmail.com", "mobileNumber": "13800000000" }
- 方案2(全局配置,适合全项目统一下划线命名的场景):在项目配置文件中添加Jackson的命名策略配置,自动完成下划线字段到驼峰属性的映射。
如果是application.yml配置:
如果是spring: jackson: property-naming-strategy: SNAKE_CASEapplication.properties配置:spring.jackson.property-naming-strategy=SNAKE_CASE - 方案3(局部字段配置,适合仅个别字段需要特殊映射的场景):给需要映射的实体类字段添加
@JsonProperty注解,指定对应的JSON字段名,示例:@Column(name = "first_name") @JsonProperty("first_name") private String firstName; @Column(name = "last_name") @JsonProperty("last_name") private String lastName; @Column(name = "serial_number") @JsonProperty("serial_number") private long serialNumber; @Column(name = "mobile_number") @JsonProperty("mobile_number") private String mobileNumber;
排查建议
开发阶段可以在接口方法第一行打个断点,debug查看@RequestBody注入的customer对象各字段值,能第一时间确认参数是否正确注入,不用等到数据库抛约束异常再定位问题。
内容的提问来源于stack exchange,提问作者renad sahal
相关产品推荐
相关产品推荐

