web-dev-qa-db-ja.com

バグ:必要なリクエスト本文がありません

私は春のフレームワークを試しています。 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)

修正してください...

5
Vu Minh Vuong

問題はこのコードにあります。

@RequestBody String id, @RequestBody String oldPass, 
                                                        @RequestBody String newPass

同じメソッドに複数の@RequestBodyを含めることはできません。1つのオブジェクトにのみバインドできるためです(本体は1回しか使用できません)。

アプローチ1:

その問題の解決策は、関連するすべてのデータをキャプチャするオブジェクトを1つ作成し、引数にあるオブジェクトを作成することです。

あなたのための1つの方法は、以下のようにすべてを単一のJSONに埋め込むことです

{id:"123", oldPass:"abc", newPass:"xyz"}

そして、以下のようにコントローラーを単一のパラメーターとして使用します

 public Message changePassword(@RequestBody String jsonStr){

        JSONObject jObject = new JSONObject(jsonStr);
.......
 }

アプローチ2:

ArgumentResolverの独自のカスタム実装を作成します

21
mhasan