Spring Webアノテーション

Spring Webアノテーション

1. 概要

このチュートリアルでは、org.springframework.web.bind.annotationパッケージのSpringWebアノテーションについて説明します。

2. @RequestMapping

簡単に言えば、@Controllerクラス内の@RequestMappingmarks request handler methods。以下を使用して構成できます。

  • path,またはそのエイリアス、メソッドがマップされるURLのname,およびvalue:

  • method:互換のHTTPメソッド

  • params:は、HTTPパラメーターの存在、不在、または値に基づいて要求をフィルター処理します

  • headers:は、HTTPヘッダーの存在、不在、または値に基づいてリクエストをフィルタリングします

  • メソッドがHTTPリクエスト本文で消費できるメディアタイプのconsumes:

  • メソッドがHTTP応答本文で生成できるメディアタイプのproduces:

これがどのように見えるかの簡単な例です:

@Controller
class VehicleController {

    @RequestMapping(value = "/vehicles/home", method = RequestMethod.GET)
    String home() {
        return "home";
    }
}

このアノテーションをクラスレベルで適用すると、default settings for all handler methods in a @Controller classを提供できます。 メソッドレベルが設定されている唯一のexception is the URL which Spring won’t overrideですが、2つのパス部分が追加されています。

たとえば、次の構成は上記のものと同じ効果があります。

@Controller
@RequestMapping(value = "/vehicles", method = RequestMethod.GET)
class VehicleController {

    @RequestMapping("/home")
    String home() {
        return "home";
    }
}

さらに、@GetMapping@PostMapping@PutMapping@DeleteMapping、および@PatchMappingは、HTTPメソッドがすでにGETに設定されている@RequestMappingの異なるバリアントです。それぞれPOST、PUT、DELETE、およびPATCH。

これらは、Spring 4.3リリース以降で利用可能です。

3. @RequestBody

@RequestBodyに移りましょう–これはbody of the HTTP request to an objectをマップします:

@PostMapping("/save")
void saveVehicle(@RequestBody Vehicle vehicle) {
    // ...
}

デシリアライゼーションは自動的に行われ、リクエストのコンテンツタイプに依存します。

4. @PathVariable

次に、@PathVariableについて話しましょう。

この注釈は、method argument is bound to a URI template variableであることを示しています。 @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

accessing HTTP request parametersには@RequestParamを使用します。

@RequestMapping
Vehicle getVehicleByParam(@RequestParam("id") long id) {
    // ...
}

@PathVariableアノテーションと同じ構成オプションがあります。

これらの設定に加えて、@RequestParamを使用すると、Springがリクエストで値を検出しないか、空の値を検出したときに注入された値を指定できます。 これを実現するには、defaultValue引数を設定する必要があります。

デフォルト値を指定すると、requiredfalse:に暗黙的に設定されます

@RequestMapping("/buy")
Car buyCar(@RequestParam(defaultValue = "5") int seatCount) {
    // ...
}

パラメータの他に、other HTTP request parts we can access: cookies and headersがあります。 それぞれ注釈@CookieValue and @RequestHeaderを使用してそれらにアクセスできます。

@RequestParamと同じ方法で構成できます。

6. 応答処理アノテーション

次のセクションでは、Spring MVCでHTTPレスポンスを操作するための最も一般的なアノテーションを見ていきます。

6.1. @ResponseBody

リクエストハンドラメソッドを@ResponseBody,Spring treats the result of the method as the response itselfでマークすると:

@ResponseBody
@RequestMapping("/hello")
String hello() {
    return "Hello World!";
}

@Controllerクラスにこのアノテーションを付けると、すべてのリクエストハンドラメソッドがそれを使用します。

6.2. @ExceptionHandler

このアノテーションを使用して、custom error handler methodを宣言できます。 リクエストハンドラメソッドが指定された例外のいずれかをスローすると、Springはこのメソッドを呼び出します。

キャッチされた例外は、引数としてメソッドに渡すことができます。

@ExceptionHandler(IllegalArgumentException.class)
void onIllegalArgumentException(IllegalArgumentException exception) {
    // ...
}

6.3. @ResponseStatus

リクエストハンドラメソッドにこのアノテーションを付けると、desired HTTP status of the responseを指定できます。 ステータスコードは、code引数、またはそのエイリアスであるvalue引数を使用して宣言できます。

また、reason引数を使用して理由を提供できます。

@ExceptionHandlerと一緒に使用することもできます。

@ExceptionHandler(IllegalArgumentException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
void onIllegalArgumentException(IllegalArgumentException exception) {
    // ...
}

HTTP応答ステータスの詳細については、this articleにアクセスしてください。

7. その他のWeb注釈

一部のアノテーションは、HTTPリクエストまたはレスポンスを直接管理しません。 次のセクションでは、最も一般的なものを紹介します。

7.1. @Controller

@Controllerを使用してSpringMVCコントローラーを定義できます。 詳細については、our article about Spring Bean Annotationsにアクセスしてください。

7.2. @RestController

@RestControllercombines @Controller and @ResponseBody

したがって、次の宣言は同等です。

@Controller
@ResponseBody
class VehicleRestController {
    // ...
}
@RestController
class VehicleRestController {
    // ...
}

7.3. @ModelAttribute

このアノテーションを使用すると、モデルキーを指定することでMVC@Controller,access elements that are already in the modelを実行できます。

@PostMapping("/assemble")
void assembleVehicle(@ModelAttribute("vehicle") Vehicle vehicleInModel) {
    // ...
}

@PathVariableおよび@RequestParamと同様に、引数の名前が同じである場合、モデルキーを指定する必要はありません。

@PostMapping("/assemble")
void assembleVehicle(@ModelAttribute Vehicle vehicle) {
    // ...
}

さらに、@ModelAttributeには別の用途があります。メソッドにアノテーションを付けると、Springはautomatically add the method’s return value to the modelになります。

@ModelAttribute("vehicle")
Vehicle getVehicle() {
    // ...
}

以前と同様に、モデルキーを指定する必要はありません。Springはデフォルトでメソッドの名前を使用します。

@ModelAttribute
Vehicle vehicle() {
    // ...
}

Springがリクエストハンドラメソッドを呼び出す前に、クラス内のすべての@ModelAttributeアノテーション付きメソッドを呼び出します。

@ModelAttributeの詳細については、this articleを参照してください。

7.4. @CrossOrigin

注釈付きリクエストハンドラメソッドの@CrossOriginenables cross-domain communication

@CrossOrigin
@RequestMapping("/hello")
String hello() {
    return "Hello World!";
}

クラスにマークを付けると、クラス内のすべてのリクエストハンドラメソッドに適用されます。

このアノテーションの引数を使用して、CORSの動作を微調整できます。

詳細については、this articleをご覧ください。

8. 結論

この記事では、Spring MVCを使用してHTTPリクエストとレスポンスを処理する方法を説明しました。

いつものように、例は利用可能なover on GitHubです。