【问题标题】:Bug: Required request body is missing错误:缺少所需的请求正文
【发布时间】:2025-12-24 01:50:11
【问题描述】:

我正在尝试 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)

请帮我修一下……

【问题讨论】:

    标签: java angularjs spring-mvc


    【解决方案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 并将用户名和密码作为请求正文传递。

      【讨论】:

        最近更新 更多