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引数を設定する必要があります。
デフォルト値を指定すると、requiredがfalse:に暗黙的に設定されます
@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です。