web-dev-qa-db-ja.com

Springの@RequestBodyアノテーションと@ResponseBodyアノテーション

Spring 3の@RequestBodyおよび@ResponseBodyアノテーションについて誰かが説明できますか?それらは何のため?どんな例でも素晴らしいでしょう。

128
leo

16.3.3.4 @RequestBodyアノテーションを使ったリクエストボディのマッピング というドキュメント内にセクション全体があります。そして 16.3.3.5 @ResponseBodyアノテーションを使ってレスポンスボディをマッピングする と呼びました。これらのセクションを参考にしてください。また、関連性があります。 @RequestBody javadocs、 @ResponseBody javadocs

使用例は次のようになります。

JQueryのようなJavaScriptライブラリを使って、あなたはこのようなJSONオブジェクトをポストするでしょう:

{ "firstName" : "Elmer", "lastName" : "Fudd" }

あなたのコントローラメソッドは次のようになります。

// controller
@ResponseBody @RequestMapping("/description")
public Description getDescription(@RequestBody UserStats stats){
    return new Description(stats.getFirstName() + " " + stats.getLastname() + " hates wacky wabbits");
}

// domain / value objects
public class UserStats{
    private String firstName;
    private String lastName;
    // + getters, setters
}
public class Description{
    private String description;
    // + getters, setters, constructor
}

クラスパスに Jackson が設定されている(そして <mvc:annotation-driven> 設定が設定されている)場合、Springは受信したJSONを投稿本文からUserStatsオブジェクトに変換します(@RequestBodyを追加したため) (@ResponseBodyアノテーションを追加したため)返されたオブジェクトをJSONにシリアル化します。ブラウザ/クライアントはこのJSONの結果を見るでしょう:

{ "description" : "Elmer Fudd hates wacky wabbits" }

完全な実用的な例については、私の以前の回答を参照してください。 https://stackoverflow.com/a/5908632/342852

注:RequestBody/ResponseBodyはもちろんJSONに限定されず、どちらもプレーンテキストとXMLを含む複数の形式を処理できますが、おそらくJSONが最もよく使用される形式です。


更新:Spring 4.x以降、通常はメソッドレベルで@ResponseBodyを使用することはなく、クラスレベルで@RestControllerを使用するのと同じ効果があります。 @RestControllerアノテーションを使用したRESTコントローラーの作成 を参照してください。

201

@ RequestBody:メソッドのパラメータを示すアノテーションは、HTTPリクエストの本文にバインドする必要があります。

例えば:

@RequestMapping(path = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body, Writer writer) throws IOException {
    writer.write(body);
}

@ ResponseBodyアノテーションをメソッドに付けることができ、戻り型をHTTPレスポンスボディに直接記述する必要があることを示します(モデルに配置したり、ビュー名として解釈したりしないでください。

例えば:

@RequestMapping(path = "/something", method = RequestMethod.PUT)
public  @ResponseBody String helloWorld() {
    return "Hello World";
}  

あるいは、@Controllerアノテーションの代わりに @ RestController アノテーションを使うこともできます。これで@ResponseBodyを使う必要がなくなります。

詳細

23
Premraj

以下はJavaコントローラのメソッドの例です。

@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public HttpStatus something(@RequestBody MyModel myModel) 
{
    return HttpStatus.OK;
}

@RequestBodyアノテーションを使用することで、特定の呼び出しを処理するために、システムで作成したモデルにマッピングされた値を取得できます。 @ResponseBodyを使用することで、リクエストが生成された場所から何かに送り返すことができます。どちらもカス​​タムパーサーなどを書かなくても簡単にマッピングできます。

4
AbdusSalam
package com.programmingfree.springshop.controller;

import Java.util.List;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.programmingfree.springshop.dao.UserShop;
import com.programmingfree.springshop.domain.User;


@RestController
@RequestMapping("/shop/user")
public class SpringShopController {

 UserShop userShop=new UserShop();

 @RequestMapping(value = "/{id}", method = RequestMethod.GET,headers="Accept=application/json")
 public User getUser(@PathVariable int id) {
  User user=userShop.getUserById(id);
  return user;
 }


 @RequestMapping(method = RequestMethod.GET,headers="Accept=application/json")
 public List<User> getAllUsers() {
  List<User> users=userShop.getAllUsers();
  return users;
 }


}

上記の例では、すべてのユーザーと特定のIDの詳細が表示されるようになりました。ここでは、IDと名前の両方を使用します。

1)localhost:8093/plejson/shop/user <---このリンクからすべてのユーザーの詳細が表示されます。
2)localhost:8093/plejson/shop/user/11 <----私がリンク手段に11を使っている場合は、特定のユーザー11の詳細を表示します。

今私はidとnameの両方を使いたい

localhost:8093/plejson/shop/user/11/raju <-----------------このようにして私たちはこのうちのどれか一つを使うことができるという意味です。 。

1
user5409646