1. 序章

Happy-path RESTは非常によく理解されており、Springを使用するとJavaでこれを簡単に実行できます。

しかし、物事がうまくいかないときはどうですか?

このチュートリアルでは、Springを使用してJSON応答の一部としてJava例外を渡すについて説明します。

全体像については、Springを使用したRESTのエラー処理およびJavaグローバル例外ハンドラーの作成に関する投稿を確認してください。

2. 注釈付きソリューション

これを解決するために、3つの基本的なSpringMVCアノテーションを使用します。

  • @RestControllerAdvice には、 @ControllerAdvice が含まれており、周囲のクラスを各 @Controller が認識すべきものとして登録し、@ResponseBodyが通知します。 Springそのメソッドの応答をJSONとしてレンダリングする
  • @ExceptionHandler は、特定の例外に対してどのメソッドを呼び出す必要があるかをSpringに通知します

これらを組み合わせることで、構成する例外を処理するSpringBeanが作成されます。 @ControllerAdviceと@ExceptionHandlerを組み合わせて使用するの詳細は次のとおりです。

3. 例

まず、クライアントに返す任意のカスタム例外を作成しましょう。

public class CustomException extends RuntimeException {
    // constructors
}

次に、例外を処理するクラスを定義し、それをJSONとしてクライアントに渡します。

@RestControllerAdvice
public class ErrorHandler {

    @ExceptionHandler(CustomException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public CustomException handleCustomException(CustomException ce) {
        return ce;
    }

}

@ResponseStatusアノテーションを追加したことに注意してください。 これにより、クライアントに送信するステータスコード(この場合は内部サーバーエラー)が指定されます。 また、 @ResponseBody は、オブジェクトがJSONでシリアル化されたクライアントに返送されることを保証します。 最後に、例外をスローする方法の例を示すダミーコントローラーを以下に示します。

@Controller
public class MainController {

    @GetMapping("/")
    public void index() throws CustomException {
        throw new CustomException();
    }

}

4. 結論

この投稿では、Springで例外を処理する方法を示しました。 さらに、JSONでシリアル化されたクライアントにそれらを送り返す方法を示しました。

この記事の完全な実装は、Githubにあります。 これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。