Spring Controllerからカスタムステータスコードを返す
1. 概要
この簡単な記事では、return custom HTTP status codes from Spring MVC controllersへのいくつかの方法を示します。
これは、クライアントへのリクエストの結果をより明確に表現し、HTTPプロトコルの完全なセマンティクスを使用するためにしばしば重要です。 たとえば、リクエストで問題が発生した場合、考えられる問題の種類ごとに特定のエラーコードを送信すると、クライアントはユーザーに適切なエラーメッセージを表示できます。
基本的なSpringMVCプロジェクトのセットアップはこの記事の範囲外ですが、詳細についてはhereを参照してください。
2. カスタムステータスコードを返す
Springは、Controllerクラスからカスタムステータスコードを返すためのいくつかの主要な方法を提供します。
-
ResponseEntityを使用する
-
例外クラスで@ResponseStatusアノテーションを使用し、
-
@ControllerAdviceおよび@ExceptionHandlerアノテーションを使用します。
これらのオプションは相互に排他的ではありません。それとはほど遠い、彼らは実際に互いに補完することができます。
この記事では、最初の2つの方法(ResponseEntityと@ResponseStatus)について説明します。 @ControllerAdviceと@ExceptionHandlerの使用について詳しく知りたい場合は、hereについて読むことができます。
2.1. ResponseEntityを介してステータスコードを返す
標準のSpring MVCコントローラーでは、単純なマッピングを定義します。
@RequestMapping(value = "/controller", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity sendViaResponseEntity() {
return new ResponseEntity(HttpStatus.NOT_ACCEPTABLE);
}
「/controller」へのGETリクエストを受信すると、Springは406コード(受け入れられません)を含む応答を返します。 この例では、特定の応答コードを任意に選択しました。 任意のHTTPステータスコードを返すことができます(完全なリストはhereにあります)。
2.2. 例外を介してステータスコードを返す
コントローラに2番目のメソッドを追加して、Exceptionを使用してステータスコードを返す方法を示します。
@RequestMapping(value = "/exception", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity sendViaException() {
throw new ForbiddenException();
}
「/exception」へのGETリクエストを受信すると、SpringはForbiddenExceptionをスローします。 これは、別のクラスで定義するカスタム例外です。
@ResponseStatus(HttpStatus.FORBIDDEN)
public class ForbiddenException extends RuntimeException {}
この例外ではコードは不要です。 すべての作業は@ResponseStatusアノテーションによって行われます。
この場合、例外がスローされると、例外をスローしたコントローラーは、応答コード403(禁止)の応答を返します。 必要に応じて、応答とともに返されるメッセージを注釈に追加することもできます。
この場合、クラスは次のようになります。
@ResponseStatus(value = HttpStatus.FORBIDDEN, reason="To show an example of a custom message")
public class ForbiddenException extends RuntimeException {}
例外からステータスコードを返すようにすることは技術的には可能ですが、ほとんどの場合、エラーコード(4XXおよび5XX)に例外を使用することは論理的に意味があることに注意することが重要です。
3. 結論
チュートリアルでは、Spring MVCコントローラーからカスタムステータスコードを返す方法を示しました。
実装はexample GitHub projectにあります。