使用Spring JPA Repository保存至MySQL时Name和Price字段为null的问题
问题排查与解决方案
1. 检查请求JSON字段名匹配
这是最常见的触发原因:请确认你发送POST/PUT请求时,JSON的字段名和Course实体类的属性名完全一致(大小写敏感)。
正确的请求体示例:
{ "name": "Java入门教程", "price": 89.9 }
如果请求里写的是Name、Price或其他拼写不一致的字段,Spring MVC无法将请求参数绑定到实体类属性,会直接导致name和price为null。
2. 确认Lombok的@Data注解生效
尽管你使用了@Data,但要确保项目已正确引入Lombok依赖,且IDE安装了Lombok插件:
Maven依赖配置示例:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
如果Lombok未生效,实体类不会自动生成setter方法,Spring无法为属性赋值,最终插入数据库时字段为null。可以通过查看编译后的class文件,确认是否生成了getter/setter方法。
3. 检查数据库表与实体类的字段映射
查看COURSE_DTLS表的实际字段名:
- 若表字段是
NAME、PRICE(大写),MySQL默认配置(lower_case_table_names=1)会自动转小写,映射不会有问题;但如果数据库配置区分大小写,需要显式指定字段映射:
@Column(name = "NAME") private String name; @Column(name = "PRICE") private Double price;
4. 验证请求的Content-Type
发送请求时必须设置Content-Type: application/json,否则@RequestBody无法正确解析JSON内容,导致属性赋值失败。比如用Postman测试时,要在请求头里添加该配置,前端请求工具(如Axios)也要对应设置请求头。
5. 调试确认实体类属性值
可以在CourseServiceImpl的upsert方法中添加打印或断点,查看传入的Course对象属性值:
@Override public String upsert(Course course) { // 调试打印 System.out.println("课程名称: " + course.getName()); System.out.println("课程价格: " + course.getPrice()); courseRepo.save(course); return "success"; }
如果打印结果为null,说明问题出在请求参数绑定阶段;如果有值,则是JPA映射或数据库配置的问题。
内容的提问来源于stack exchange,提问作者Praveen Kumar
相关产品推荐
相关产品推荐

