React向Spring Boot后端发POST请求遇RequestBody缺失错误求助
解决React Axios POST请求到Spring后端时的"Required request body is missing"错误
嘿,我来帮你捋清楚这个问题!你遇到的这个错误,核心原因是Spring里@RequestBody注解的用法理解错了,咱们一步步来解决:
问题根源
你的后端控制器方法getVistaConnection里,给四个参数都加了@RequestBody注解——这可是Spring里的大忌!@RequestBody的作用是把**整个HTTP请求体(也就是你前端Axios发的那个JSON对象)**绑定到一个Java对象上,一个请求方法里只能用一次这个注解。你现在让Spring把同一个请求体拆成四个独立的String参数,它根本做不到,所以就会抛出"Required request body is missing"的错误。
解决方案
咱们需要用一个DTO(数据传输对象)来封装前端传来的所有参数,让Spring能正确解析请求体:
1. 创建一个DTO类
先新建一个专门用来接收请求参数的类,把你需要的四个字段都放进去:
package com.va.med.dashboard.models; // 根据你的项目包结构调整路径 public class VistaConnectionRequest { // 和前端传来的JSON字段名一一对应 private String ipString; private String portString; private String accessPin; private String verifyPin; // 必须要有无参构造函数,Spring需要它来实例化对象 public VistaConnectionRequest() {} // Getter和Setter方法,Spring需要通过这些方法注入属性值 public String getIpString() { return ipString; } public void setIpString(String ipString) { this.ipString = ipString; } public String getPortString() { return portString; } public void setPortString(String portString) { this.portString = portString; } public String getAccessPin() { return accessPin; } public void setAccessPin(String accessPin) { this.accessPin = accessPin; } public String getVerifyPin() { return verifyPin; } public void setVerifyPin(String verifyPin) { this.verifyPin = verifyPin; } }
2. 修改控制器方法
把原来的四个@RequestBody参数换成咱们刚创建的DTO类,只保留一个@RequestBody注解:
// 可以用更简洁的@PostMapping代替@RequestMapping(method = RequestMethod.POST) @PostMapping(value = "/vista", produces = "application/json") @ResponseStatus(value = HttpStatus.ACCEPTED) public String getVistaConnection(@RequestBody VistaConnectionRequest request) { // 从DTO对象里取出各个参数 System.out.println(request.getIpString()); System.out.println(request.getPortString()); System.out.println(request.getAccessPin()); System.out.println(request.getVerifyPin()); vistaService.connect(request.getIpString(), request.getPortString(), request.getAccessPin(), request.getVerifyPin()); return vistaService.connected ? "Connected" : "Not Connected"; }
3. 前端代码不用改!
你写的Axios请求完全没问题,它发送的是一个包含四个字段的JSON对象,和咱们的DTO结构完美匹配,所以前端不需要做任何调整。
额外小建议
如果你的项目用了Spring Boot,推荐用Lombok来简化DTO类的代码——只需要添加Lombok依赖,然后用@Data注解,就能自动生成Getter、Setter、构造函数等方法,DTO代码会变得非常简洁:
package com.va.med.dashboard.models; import lombok.Data; @Data public class VistaConnectionRequest { private String ipString; private String portString; private String accessPin; private String verifyPin; }
这样调整之后,Spring就能正确解析你的请求体,那个错误就会消失啦!
内容的提问来源于stack exchange,提问作者Jeffrey Yourman
相关产品推荐
相关产品推荐

