web-dev-qa-db-ja.com

Spring MVCで必須の文字列パラメータが存在しないエラー

Spring MVCのコントローラーにAJAXクエリを作成しようとしています。

私のアクションコードは次のとおりです。

@RequestMapping(value = "events/add", method = RequestMethod.POST)
public void addEvent(@RequestParam(value = "start_date") String start_date, @RequestParam(value = "end_date") String end_date, @RequestParam(value = "text") String text, @RequestParam(value = "userId") String userId){
    //some code    
}

私のAjaxクエリは次のとおりです。

$.ajax({
        type: "POST",
        url:url,
        contentType: "application/json",
        data:     {
                start_date:   scheduler.getEvent(id).start_date,
                end_date:  scheduler.getEvent(id).end_date,
                text: scheduler.getEvent(id).text,
                userId: userId
        },
        success:function(result){
         //here some code
        }
    });

しかし、エラーが発生しました:

必須の文字列パラメーター '' start_dateは存在しません

どうして?私が知っているように、私はそれを(@RequestParam(value = "start_date") String start_date

[〜#〜] udp [〜#〜]
今、データを取得するために404クラスを提供しています

public class EventData {
    public String end_date;
    public String start_date;
    public String text;
    public String userId;
    //Getters and setters
}

私のjs AJAX呼び出しは:

$.ajax({
    type: "POST",
    url:url,
    contentType: "application/json",
    // data: eventData,
    processData: false,
    data:    JSON.stringify({
        "start_date":   scheduler.getEventStartDate(id),
        "end_date":  scheduler.getEventEndDate(id),
        "text": scheduler.getEventText(id),
        "userId": "1"
    }),

そしてコントローラーのアクション:

@RequestMapping(value = "events/add", method = RequestMethod.POST)
public void addEvent(@RequestBody EventData eventData){    
}

JSONデータは次のとおりです。

end_date: "2013-10-03T20:05:00.000Z"
start_date: "2013-10-03T20:00:00.000Z"
text: "gfsgsdgs"
userId: "1"
21
nabiullinas

サーバー側では、リクエストパラメーターをクエリ文字列として期待しますが、クライアント側ではjsonオブジェクトを送信します。 JSONをバインドするには、すべてのパラメーターを保持する単一のクラスを作成し、@ RequestParamではなく@RequestBodyアノテーションを使用する必要があります。

@RequestMapping(value = "events/add", method = RequestMethod.POST)
public void addEvent(@RequestBody CommandBean commandBean){
    //some code
}

こちら より詳細な説明。

37
gadget

私は同じ問題を抱えていました。投稿リクエストで設定パラメータを指定することで解決しました。

var config = {
    transformRequest : angular.identity,
    headers: { "Content-Type": undefined }
}

$http.post('/getAllData', inputData, *config*).success(function(data,status) {
    $scope.loader.loading = false;
})

configは、私が含めたパラメーターであり、機能し始めました。

0
User-8017771