1. 概要

このクイック記事では、SpringMVCコントローラーからカスタムHTTPステータスコードを返すいくつかの方法を紹介します。

これは、クライアントへの要求の結果をより明確に表現し、HTTPプロトコルの完全なリッチセマンティクスを使用するために重要になることがよくあります。 たとえば、リクエストで問題が発生した場合、考えられる問題の種類ごとに特定のエラーコードを送信すると、クライアントは適切なエラーメッセージをユーザーに表示できます。

基本的なSpringMVCプロジェクトのセットアップはこの記事の範囲外ですが、詳細についてはここを参照してください。

2. カスタムステータスコードを返す

Springは、Controllerクラスからカスタムステータスコードを返すためのいくつかの主要な方法を提供します。

  • ResponseEntityを使用する
  • 例外クラスで@ResponseStatusアノテーションを使用し、
  • @ControllerAdviceおよび@ExceptionHandlerアノテーションを使用します。

これらのオプションは相互に排他的ではありません。 それから遠く離れて、彼らは実際にお互いを補完することができます。

この記事では、最初の2つの方法(ResponseEntity@ResponseStatus)について説明します。 @ControllerAdviceおよび@ExceptionHandlerの使用について詳しく知りたい場合は、ここで読むことができます。

2.1. ResponseEntityを介してステータスコードを返す

標準のSpringMVCコントローラーでは、簡単なマッピングを定義します。

@RequestMapping(value = "/controller", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity sendViaResponseEntity() {
    return new ResponseEntity(HttpStatus.NOT_ACCEPTABLE);
}

/controller 」へのGETリクエストを受信すると、Springは406コード(受け入れられません)を含む応答を返します。 この例では、特定の応答コードを任意に選択しました。 任意のHTTPステータスコードを返すことができます(完全なリストはここにあります)。

2.2. 例外を介してステータスコードを返す

Exception を使用してステータスコードを返す方法を示すために、コントローラーに2番目のメソッドを追加します。

@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. 結論

チュートリアルでは、SpringMVCコントローラーからカスタムステータスコードを返す方法を示しました。

実装はサンプルGitHubプロジェクトにあります。