開発者ドキュメント

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で利用可能]にあります。




  • «** 前へ

モバイルバージョンを終了