Spring Boot中Post请求经Hibernate写入MySQL后返回Null问题求助
问题排查:Spring Boot API返回Null且数据未插入MySQL
问题描述
程序开发完成后,使用Postman测试API时出现以下异常:
- Controller返回的数据仅自增id有值,其余字段持续为Null
- 无任何代码报错,但Hibernate始终返回Null结果
- Post请求提交的数据并未插入MySQL数据库
相关代码及Postman响应如下:
实体类代码
@Entity @AllArgsConstructor @NoArgsConstructor @Data @Table(name = "student_lib") public class StudentLibrary { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String addressess; private String email; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddressess() { return addressess; } public void setAddressess(String addressess) { this.addressess = addressess; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public StudentLibrary(Long id, String name, String addressess, String email) { super(); this.id = id; this.name = name; this.addressess = addressess; this.email = email; } }
Service层代码
@Service public class LibService { @Autowired private LibRepository repository; public StudentLibrary getLibraryById(Long id) { return repository.findById(id).get(); } public StudentLibrary insertLibrary(StudentLibrary studentLibrary) { return repository.save(studentLibrary); } }
Controller层代码
@RestController @RequestMapping("/Api") public class LibController { @Autowired LibService service; @GetMapping("/Lib") public StudentLibrary getAllDataById(Long id) { return service.getLibraryById(id); } @PostMapping("/save") public StudentLibrary insertData(StudentLibrary studentLibrary) { return service.insertLibrary(studentLibrary); } }
Postman响应结果
{ "id": 12, "name": null, "addressess": null, "email": null }
问题原因及解决方法
1. Post请求参数绑定失败
- 原因:Controller的
insertData方法直接接收StudentLibrary对象,但未添加@RequestBody注解,Spring无法将请求体的JSON数据绑定到实体类对象上,导致除自增id外,其他字段均为Null。 - 解决:在方法参数上添加
@RequestBody注解:@PostMapping("/save") public StudentLibrary insertData(@RequestBody StudentLibrary studentLibrary) { return service.insertLibrary(studentLibrary); } - 补充:Postman请求时需设置请求头
Content-Type: application/json,且请求体为合法JSON格式。
2. 实体类注解与手动代码冲突
- 原因:实体类同时使用Lombok的
@Data注解(自动生成getter/setter、构造方法等)和手动编写的getter/setter、构造方法,二者冲突导致属性赋值、读取异常。 - 解决:删除所有手动编写的getter/setter和构造方法,保留Lombok注解即可,Lombok会自动生成正确的方法:
@Entity @AllArgsConstructor @NoArgsConstructor @Data @Table(name = "student_lib") public class StudentLibrary { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String addressess; private String email; }
3. Get请求参数未明确绑定
- 原因:
getAllDataById方法的Long id参数未添加@RequestParam注解,Spring无法正确识别URL中的参数,可能导致查询时id值不正确,返回Null。 - 解决:添加
@RequestParam注解明确参数来源:@GetMapping("/Lib") public StudentLibrary getAllDataById(@RequestParam Long id) { return service.getLibraryById(id); }
4. Repository未正确继承JpaRepository
- 原因:如果
LibRepository未继承JpaRepository<StudentLibrary, Long>,findById和save方法无法正常与数据库交互,导致数据操作失败。 - 解决:确保Repository接口正确继承:
public interface LibRepository extends JpaRepository<StudentLibrary, Long> { }
5. 事务未正确执行(可选排查)
- 原因:虽然Spring Boot默认会为
@Service类方法开启事务,但特殊配置下可能失效,导致save操作未提交到数据库。 - 解决:在
LibService的insertLibrary方法上添加@Transactional注解:@Transactional public StudentLibrary insertLibrary(StudentLibrary studentLibrary) { return repository.save(studentLibrary); }
内容的提问来源于stack exchange,提问作者Kim kim
相关产品推荐
相关产品推荐

