为何使用@RequestBody接收字符串时出现「Required request body is missing」错误?
先看返回的错误信息:
{
"timestamp": "2022-11-20T13:17:24.172+0000",
"status": 400,
"error": "Bad Request",
"message": "Required request body is missing: public java.lang.String"
}
错误核心原因
@RequestBody的强制约束:接口方法里的
prodId参数加了@RequestBody注解,Spring MVC会强制要求该参数必须从HTTP请求体(Request Body)中获取,且请求必须携带非空的请求体。如果调用接口时没有传入请求体,或者请求体为空,就会直接抛出这个400错误。传参方式与接口定义不匹配:DELETE请求场景下,多数调用方习惯用URL路径参数(如
/products/123)或查询参数(如/deleteProduct?prodId=123)传递产品ID,但你的接口定义是从请求体读取prodId。如果调用方按习惯用路径/查询参数传值,没在请求体里放内容,就会触发"缺少请求体"的错误。请求体格式不兼容(次要可能):即使传了请求体,如果格式无法被Spring解析为String类型(比如传入复杂JSON对象而非纯字符串),也可能触发该错误,但这种情况相对少见,最常见的还是完全未传请求体的场景。
可选修正方案
如果想改用更符合DELETE请求习惯的传参方式,可以修改接口参数:
// 改用路径参数 public String deleteProduct(@PathVariable String prodId, HttpServletRequest request) throws NotLoggedInException { // 原有校验与业务逻辑保留 }
如果坚持用请求体传参,调用接口时必须在请求体中传入字符串格式的产品ID,比如请求体内容直接写"PROD001"(注意要带字符串引号)。
内容的提问来源于stack exchange,提问作者Mohana

