web-dev-qa-db-ja.com

Spring MVCで@RequestParamをオブジェクトにバインドする方法は?

AJAXを介してPOSTリクエストを作成し、クラスオブジェクト全体をリクエストにバインドし、そのリクエストを@requestParamアノテーションで受け取りたい。 @requestBodyアノテーションでできますが、知りたいのですが、@requestParamアノテーションでできますか?

Ajaxコード:

var restDTO{
    id: 3,
    name: "hello"
}

 $.ajax({
          url: url, 
          type: 'POST',
          dataType: 'json',
          contentType: 'application/json',
          mimeType: 'application/json',
          data: JSON.stringify({RestDTO : restDTO}),          
          success: function(data) 
    {
    }

RestDTOがあります

Class RestDTO 
{

    int id;
    String name;

    //getter and setter

}

コントローラー内

public String content(@RequestParam RestDTO restDTO){...}

このコードを実行するにはどうすればよいですか?

Ajaxからデータを送信する際に何を変更する必要がありますか?

@requestParam注釈付きのRestDtoオブジェクトを受信するには、サーバーで変更する必要がありますか?

6
user3029929

@RequestParamが示すように、oneメソッドのパラメーターをone Webリクエストのパラメーターにバインドする必要はありません。オブジェクトへのマッピングはできません。 @RequestParamを使用するには、ajaxリクエストを変更する必要があります。

var restDTO{
   id: 3,
   name: "hello"
}

 $.ajax({
          url: url, 
          type: 'POST',
          data: restDTO,          
          success: function(data){
             ....
          }
});

JQueryはリクエストをapplication/x-www-form-urlencodedとして送信し、データをパラメーターに自動的に処理します。コントローラーのメソッドは次のようになります。

@RequestMapping("/url")
public String content(@RequestParam Long id, @RequestParam String name){...}

パラメータをオブジェクトに自動的にマッピングするには、@ModelAttributeアノテーションを使用できます。

@RequestMapping("/url")
public String content(@ModelAttribute RestDTO restDTO){...}

この場合、javascriptマップの名前はRestDTOのプロパティの名前と一致する必要があります。

通常、@ModelAttribute@RequestBodyは同じ目的で作成されます。リクエストからメソッドへのデータのバインド(プリミティブ型のオブジェクトかどうか)。

Html-formsやプレーンなオブジェクトを扱う場合、@ModelAttributeの方が便利だと思います。 modelAttributepathなどのSpring機能を使用する準備ができています。

さらに、データを手動で制御する必要がある場合は、@RequestBodyがより柔軟になります。また、複雑なオブジェクトを操作する場合に便利です。

個人的に私は@RequestBodyとjsonを好むでしょう。

14
Ken Bekov

データを従来のリクエストパラメータとして送信する場合は、@RequestParamを省略するだけでオブジェクトにバインドできます。

public String content(RestDTO restDTO){...}

jsonを送信する場合は、@RequestBodyを使用する必要があります。

なぜ @RequestParam を主張している場合でも、マップに対して複数の値をバインドできることに注意してください。

public String content(@RequestParam Map<String, String> restDTO){...}

@RequestParam ドキュメントから

メソッドパラメータがMapまたはMultiValueMapで、パラメータ名が指定されていない場合、マップパラメータにはすべてのリクエストパラメータの名前と値が入力されます。

8
Master Slave

Spring Webには、次の注釈があります。

RequestParam-パラメータの取得に使用(/ path?name =)

PathVariable-パスパラメーターに使用(/ path/{name})

RequestBody-post/put/patchなどに使用されます

RequestHeader-ヘッダー用

したがって、post paramsにRequestParamを使用することはできません。jsonであるかどうかは関係ありません

3
Alexandru Godri