Springの@RequestBodyおよび@ResponseBodyアノテーション


138

誰かがSpring 3の@RequestBody@ResponseBody注釈について説明できますか?それらは何のため?どんな例でもいいでしょう。

回答:


218

16.3.3.4と呼ばれるドキュメント内のセクション全体が@RequestBodyアノテーションでリクエストボディをマッピングします。そして16.3.3.5 @ResponseBodyアノテーションでレスポンスボディをマッピングするものを呼び出しました。これらのセクションを参照することをお勧めします。関連:@RequestBodyjavadocs、@ResponseBodyjavadocs

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

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
}

今あなたが持っている場合にはジャクソン(および持っているあなたのクラスパス上に<mvc:annotation-driven>設定)(あなたが追加したので、春には、ポスト本体からUserStatsオブジェクトに入ってくるJSONを変換します@RequestBody注釈)を、あなたが追加したので、それはJSON(に返されたオブジェクトをシリアライズう@ResponseBodyアノテーション)。したがって、ブラウザ/クライアントはこのJSON結果を表示します。

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

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

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


更新

Spring 4.x以降、通常は@ResponseBodyメソッドレベルではなく@RestController、クラスレベルで使用しますが、同じ効果があります。

以下は、Spring MVCの公式ドキュメントからの引用です。

@RestControllerある合成注釈自体は、注釈付きメタ@Controllerし、@ResponseBodyそのすべてのメソッドタイプレベルの継承するコントローラを示すために@ResponseBody注釈を、したがって、ビューの解像度に対するレスポンスボディに直接書き込み、HTMLテンプレートでレンダリングします。


リンクされた回答@ResponseBodyでは、メソッドではなくパラメーターの注釈を使用しました。メソッドに配置しようとするとエラーが発生するので、他の答えは正しいと思います。私はあなたがgetDescription(@RequestBody UserStats stats)上記を持っているべきだと思います。
Patrick

3
@Patrickいいえ、@RequestBodyパラメーターに@ResponseBodyあり、メソッドにあります。重要な違い!
ショーンパトリックフロイド

1
@SeanPatrickFloyd申し訳ありません、私はまったく言及するつもりはありませんでした@ResponseBody。あなたが今言ったよう@RequestBodyに、パラメーターに行きますよね?しかし、上記の答えでは、メソッドにそれがあります。
Patrick

1
@SeanPatrickFloyd @RequestBodyは実際にはまだ必要で@ResponseBodyあり、を使用する場合は暗黙的@RestControllerです。Plsはあなたの答えを訂正します、それはfalseになるにはあまりにも多くの投票があります!
Sumit Jain 2017年

@SumitJainは公平である:この回答は以前に@RestControllerあり、導入時に変更されました
Sean Patrick Floyd

32

@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";
}  

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

詳細については


5

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

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

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


1
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と名前の両方を使いたいです

localhost:8093 / plejson / shop / user / 11 / raju <-----------------このように、これは私たちがこれでどれでも使用できることを意味します。助けてください... 。


回答とコードサンプルの形式を修正してください。
Maciej Lach、2015年

このコードが質問者にどのように役立つか説明してください。ありがとうございました。
Leonid Glanz、2015年

programming-free.com/2014/03/… ....................このリンクを通過しますu取得します...ありがとう
user5409646

programming-free.com/2014/03/… ....................................... ................................................................. .....このリンクを通過すると、感謝されます
user5409646
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.