React向Spring Boot传对象遇请求体缺失及参数格式问题求助
解决React向Spring Boot传递POST请求时"Required request body is missing"错误
问题现象
调用POST接口时持续收到如下错误:
Error: Required request body is missing: public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.String>> com.example.RegisterLogin.controller.RegisterController.registerHandler(java.lang.Object)
相关代码如下:
Spring Boot 后端代码
@PostMapping("/register") public ResponseEntity<Map<String,String>> registerHandler(@RequestBody Object registerDTO) { log.info("User: {}",registerDTO); return ResponseEntity.ok(registerService.saveUser((RegisterDTO) registerDTO)); }
React 前端代码
export class RegisterService{ save(user){ console.log({ method: 'POST', headers: { accept: 'application/json', body: JSON.stringify({registerDTO: user})}}) fetch('http://localhost:8080/api/auth/register', { method: 'POST', headers: { accept: 'application/json', body: JSON.stringify({registerDTO: user})}}) .then(data => console.log(data.json())) // Parsing the data into a JavaScript object .then(json => alert(JSON.stringify(json))) } }
前端传递的请求体是嵌套格式:{registerDTO={name=w, dsurname=wd, ...}},但用Postman直接传递扁平对象{name=edfew, surname=feefewe, ...}时接口正常。
问题原因
- 请求体格式不匹配:后端期望直接接收包含用户属性的扁平对象,但前端把
user包装在了registerDTO字段下,导致Spring无法将请求体映射到目标对象,进而识别为请求体缺失。 - 缺少必要请求头:前端请求未设置
Content-Type: application/json,Spring无法正确解析JSON格式的请求体。 - 后端接收类型不规范:用
Object接收请求体再强制转换为RegisterDTO,不仅不安全,也会增加Spring解析的复杂度。
解决方案
1. 修正前端请求代码
- 去掉
registerDTO包装,直接序列化user对象 - 添加
Content-Type: application/json请求头 - 修正then链的异步处理(
data.json()返回Promise,需要return才能传递到下一个then)
修改后的前端代码:
export class RegisterService{ save(user){ const requestOptions = { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify(user) }; console.log(requestOptions); fetch('http://localhost:8080/api/auth/register', requestOptions) .then(response => response.json()) .then(json => alert(JSON.stringify(json))) .catch(error => console.error('请求错误:', error)); } }
2. 优化后端接收代码
直接用RegisterDTO作为请求体参数,避免强制类型转换,让Spring自动完成JSON映射:
@PostMapping("/register") public ResponseEntity<Map<String,String>> registerHandler(@RequestBody RegisterDTO registerDTO) { log.info("User: {}", registerDTO); return ResponseEntity.ok(registerService.saveUser(registerDTO)); }
这样修改后,前端传递的扁平用户对象就能被后端正确解析,不会再出现请求体缺失的错误。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

