错误:缺少所需的请求正文
Posted
技术标签:
【中文标题】错误:缺少所需的请求正文【英文标题】:Bug: Required request body is missing 【发布时间】:2017-08-01 21:20:30 【问题描述】:我正在尝试 Spring 框架。 我有 RestController 和函数:
@RequestMapping(value="/changePass", method=RequestMethod.POST)
public Message changePassword(@RequestBody String id, @RequestBody String oldPass,
@RequestBody String newPass)
int index = Integer.parseInt(id);
System.out.println(id+" "+oldPass+" "+newPass);
return userService.changePassword(index, oldPass, newPass);
和代码 angularJS
$scope.changePass = function()//changePass
$scope.data =
id: $scope.userId,
oldPass:$scope.currentPassword,
newPass:$scope.newPassword
$http.post("http://localhost:8080/user/changePass/", $scope.data).
success(function(data, status, headers, config)
if(date.state)
$scope.msg="Change password seccussful!";
else
$scope.msg=date.msg;
)
.error(function(data, status, headers, config)
$scope.msg="TOO FAIL";
);
当我运行它时。
错误信息:
Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public com.csc.mfs.messages.Message com.csc.mfs.controller.UserController.changePassword(java.lang.String,java.lang.String,java.lang.String)
请帮我修一下……
【问题讨论】:
【参考方案1】:问题出在这段代码中。
@RequestBody String id, @RequestBody String oldPass,
@RequestBody String newPass
你不能在同一个方法中有多个
@RequestBody
,因为它可以绑定到一个 仅限单个对象(身体只能消耗一次)。
方法 1:
针对该问题的补救措施,创建一个将捕获所有相关数据的对象,然后创建参数中的对象。
一种方法是将它们全部嵌入到单个 JSON 中,如下所示
id:"123", oldPass:"abc", newPass:"xyz"
并将您的控制器作为单个参数,如下所示
public Message changePassword(@RequestBody String jsonStr)
JSONObject jObject = new JSONObject(jsonStr);
.......
方法 2:
为ArgumentResolver
创建您自己的自定义实现
【讨论】:
【参考方案2】:您不能有 GET 方法的请求正文。如果您想将用户名和密码作为请求正文的一部分传递,则将 RequestMethod 类型更改为 POST/PUT。
如果您只想使用 GET,则必须将用户名和密码作为路径变量或请求/查询参数传递 - 这不是最佳做法。
我建议更改 RequestMethod 并将用户名和密码作为请求正文传递。
【讨论】:
以上是关于错误:缺少所需的请求正文的主要内容,如果未能解决你的问题,请参考以下文章
使用 ContentCachingRequestWrapper 后缺少所需的请求正文
使用 HttpServletRequestWrapper 制作副本后缺少所需的请求正文
缺少所需的请求正文内容:org.springframework.web.method.HandlerMethod$HandlerMethodParameter
缺少所需的请求正文:public org.springframework.http.ResponseEntity<..model.Customer>