回答:
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
}
今あなたが持っている場合にはジャクソン(および持っているあなたのクラスパス上に<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テンプレートでレンダリングします。
@RequestBody
パラメーターに@ResponseBody
あり、メソッドにあります。重要な違い!
@ResponseBody
。あなたが今言ったよう@RequestBody
に、パラメーターに行きますよね?しかし、上記の答えでは、メソッドにそれがあります。
@RequestBody
は実際にはまだ必要で@ResponseBody
あり、を使用する場合は暗黙的@RestController
です。Plsはあなたの答えを訂正します、それはfalseになるにはあまりにも多くの投票があります!
@RestController
あり、導入時に変更されました
@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
ます。
以下は、Javaコントローラーのメソッドの例です。
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public HttpStatus something(@RequestBody MyModel myModel)
{
return HttpStatus.OK;
}
@RequestBodyアノテーションを使用すると、特定の呼び出しを処理するためにシステムで作成したモデルにマッピングされた値が得られます。@ResponseBodyを使用すると、リクエストが生成された場所に何でも送信できます。カスタムパーサーなどを作成せずに、両方を簡単にマッピングできます。
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 <-----------------このように、これは私たちがこれでどれでも使用できることを意味します。助けてください... 。
@ResponseBody
では、メソッドではなくパラメーターの注釈を使用しました。メソッドに配置しようとするとエラーが発生するので、他の答えは正しいと思います。私はあなたがgetDescription(@RequestBody UserStats stats)
上記を持っているべきだと思います。