Spring Webアノテーション
1.概要
このチュートリアルでは、
org.springframework.web.bind.annotation
パッケージからのSpring Webアノテーションを調べます。
2.
@ RequestMapping
簡単に言えば、
@ RequestMapping
**
@ Controller
クラス内に要求ハンドラメソッドをマークします。それを使用して設定することができます。
-
path、
またはその別名、
name、
、および
value:
メソッドのURL
にマッピングされた
**
method:
互換HTTPメソッド
-
params:
存在、不在、またはの値に基づいて要求をフィルタリングします。
HTTPパラメータ
**
headers:
の有無、値に基づいてリクエストをフィルタリングします。
HTTPヘッダ
**
consumes:
メソッドがHTTPで消費できるメディアタイプ
リクエストボディ
**
produces:
メソッドがHTTPで生成できるメディアタイプ
レスポンスボディ
これは、次のような簡単な例です。
@Controller
class VehicleController {
@RequestMapping(value = "/vehicles/home", method = RequestMethod.GET)
String home() {
return "home";
}
}
このアノテーションをクラスレベルで適用すれば、
@ Controller
クラス内のすべてのハンドラメソッドに** デフォルト設定を提供することができます。唯一の例外は、Springがメソッドレベルの設定を上書きしないで、2つのパス部分を追加するURLです。
たとえば、次の設定は上記と同じ効果があります。
@Controller
@RequestMapping(value = "/vehicles", method = RequestMethod.GET)
class VehicleController {
@RequestMapping("/home")
String home() {
return "home";
}
}
さらに、
@ GetMapping
、
@ PostMapping
、
@ PutMapping
、
@ DeleteMapping
、および
@ PatchMapping
は、それぞれHTTPメソッドがすでにGET、POST、PUT、DELETE、およびPATCHに設定されている
@ RequestMapping
の異なるバリアントです。
これらはSpring 4.3リリース以降に利用可能です。
3.
@ RequestBody
@ RequestBody
– それはHTTPリクエストの
ボディをオブジェクト
にマッピングします:
@PostMapping("/save")
void saveVehicle(@RequestBody Vehicle vehicle) {
//...
}
逆シリアル化は自動的に行われ、リクエストのコンテンツタイプによって異なります。
4.
@ PathVariable
次に、
@ PathVariable
について話しましょう。
この注釈は、
method引数がURIテンプレート変数
にバインドされていることを示しています。
@ RequestMapping
アノテーションを使用してURIテンプレートを指定し、
@ PathVariable
を使用してメソッド引数をテンプレート部分の1つにバインドできます。
これは、
name
またはその別名、
value
引数を使用して実現できます。
@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable("id") long id) {
//...
}
テンプレート内の部分の名前がメソッド引数の名前と一致する場合は、アノテーション内でそれを指定する必要はありません。
@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable long id) {
//...
}
さらに、引数
required
をfalseに設定することで、パス変数をオプションとしてマークできます。
@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable(required = false) long id) {
//...
}
5.
@ RequestParam
HTTPリクエストパラメータへのアクセスには、@ @ RequestParam__を使用します。
@RequestMapping
Vehicle getVehicleByParam(@RequestParam("id") long id) {
//...
}
@ PathVariable
アノテーションと同じ設定オプションがあります。
これらの設定に加えて、
@ RequestParam
を使用して、Springがリクエストで値を検出しなかったか空の値を検出したときに注入された値を指定できます。これを実現するには、
defaultValue
引数を設定する必要があります。
デフォルト値を指定すると、
required
が__falseに暗黙的に設定されます。
@RequestMapping("/buy")
Car buyCar(@RequestParam(defaultValue = "5") int seatCount) {
//...
}
パラメータ以外にも、アクセス可能な他のHTTPリクエスト部分があります。
クッキーとヘッダー
アノテーション
@ CookieValue
と
@ RequestHeader
** でそれぞれアクセスできます。
@ RequestParam
と同じ方法で設定できます。
6.レスポンス処理アノテーション
次のセクションでは、Spring MVCでHTTPレスポンスを操作するための最も一般的なアノテーションを見ていきます。
6.1.
@ ResponseBody
リクエストハンドラメソッドを
@ResponseBody
でマークすると、
Springはメソッドの結果をレスポンスそのものとして扱います
:
@ResponseBody
@RequestMapping("/hello")
String hello() {
return "Hello World!";
}
このアノテーションで
@ Controller
クラスにアノテーションを付けると、すべてのリクエストハンドラメソッドがそれを使用します。
6.2.
@ ExceptionHandler
このアノテーションを使うと、
カスタムエラーハンドラメソッド
を宣言できます。
リクエストハンドラメソッドが指定された例外のいずれかをスローすると、Springはこのメソッドを呼び出します。
キャッチした例外は引数としてメソッドに渡すことができます。
@ExceptionHandler(IllegalArgumentException.class)
void onIllegalArgumentException(IllegalArgumentException exception) {
//...
}
6.3.
@ ResponseStatus
このアノテーションでリクエストハンドラメソッドにアノテーションを付けると、レスポンスの
希望のHTTPステータス
を指定できます。
code
引数、またはその別名、
value
引数を使用してステータスコードを宣言できます。
また、
reason
引数を使用して理由を提供できます。
@ ExceptionHandler
と一緒に使うこともできます。
@ExceptionHandler(IllegalArgumentException.class)
@ResponseStatus(HttpStatus.BAD__REQUEST)
void onIllegalArgumentException(IllegalArgumentException exception) {
//...
}
HTTPレスポンスステータスの詳細については、リンク:/spring-mvc-controller-custom-http-status-code[この記事]を参照してください。
7.その他のWeb注釈
一部のアノテーションはHTTPリクエストやレスポンスを直接管理しません。次のセクションでは、最も一般的なものを紹介します。
7.1.
@コントローラ
Spring MVCコントローラは
@ Controller
で定義できます。詳しくは
Spring Bean Annotationsに関する記事
をご覧ください。
7.2.
@ RestController
@ RestController
は、
@ Controller
と
@ ResponseBody
を組み合わせたものです。
したがって、次の宣言は等価です。
@Controller
@ResponseBody
class VehicleRestController {
//...
}
@RestController
class VehicleRestController {
//...
}
7.3.
@ ModelAttribute
このアノテーションを使用すると、モデルキーを提供することで、MVC
@ Controller、
のモデル内にすでに存在する要素にアクセスできます。
@PostMapping("/assemble")
void assembleVehicle(@ModelAttribute("vehicle") Vehicle vehicleInModel) {
//...
}
@ PathVariable
や
@ RequestParam
と同様に、引数の名前が同じ場合はモデルキーを指定する必要はありません。
@PostMapping("/assemble")
void assembleVehicle(@ModelAttribute Vehicle vehicle) {
//...
}
その上、
@ ModelAttribute
には別の用途があります。それにメソッドに注釈を付けると、Springは自動的にそのメソッドの戻り値をモデルに追加します**
@ModelAttribute("vehicle")
Vehicle getVehicle() {
//...
}
以前と同様に、モデルキーを指定する必要はありません。Springはデフォルトでメソッドの名前を使用します。
@ModelAttribute
Vehicle vehicle() {
//...
}
Springはリクエストハンドラメソッドを呼び出す前に、クラス内のすべての
@ ModelAttribute
アノテーション付きメソッドを呼び出します。
@ ModelAttribute
の詳細については、/spring-mvc-the-modelattribute-annotation[この記事]を参照してください。
7.4.
@ CrossOrigin
@ CrossOrigin
は、注釈付きリクエストハンドラメソッドのクロスドメイン通信
を有効にします。
@CrossOrigin
@RequestMapping("/hello")
String hello() {
return "Hello World!";
}
クラスにマークを付けると、その中のすべてのリクエストハンドラメソッドに適用されます。
このアノテーションの引数でCORSの振る舞いを微調整できます。
詳しくは
この記事
をご覧ください。
8.まとめ
この記事では、Spring MVCでHTTPリクエストとレスポンスを処理する方法を説明しました。
いつものように、例はhttps://github.com/eugenp/tutorials/tree/master/spring-boot-mvc[GitHubで利用可能]にあります。
次
”
-
«** 前へ