Springを使用したJSONでの例外のレンダリング

1. 前書き

Happy-path RESTは非常によく理解されており、SpringはこれをJavaで簡単に行えるようにします。
しかし、物事がうまくいかないときはどうでしょうか?
このチュートリアルでは、* Springを使用してJSON応答の一部としてJava例外を渡す*について説明します。
より広く見るには、https://www.baeldung.com/exception-handling-for-rest-with-spring [Springを使用したRESTのエラー処理]およびlink:/の投稿をご覧ください。 java-global-exception-handler [Javaグローバル例外ハンドラーの作成]。

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

これを解決するために、3つの基本的なSpring MVCアノテーションを使用します。
  • * _ @ RestControllerAdvice_ *に_ @ ControllerAdvice_を含む
    各_ @ Controller_が認識する必要があるものとして周囲のクラスを登録し、_ @ ResponseBody_を使用して、そのメソッドの応答をJSONとしてレンダリングするようSpringに指示します

  • * _ @ ExceptionHandler_は、Springのどのメソッドを
    特定の例外に対して呼び出されます*

    これらを組み合わせて、構成する例外を処理するSpring Beanを作成します。 link:/exception-handling-for-rest-with-spring#controlleradvice [_ @ 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;
    }

}
link:/spring-response-status#error-handling[[email protected]_]注釈を追加したことに注意してください。 これにより、クライアントに送信するステータスコード(この場合は内部サーバーエラー)が指定されます。 また、_ @ ResponseBody_は、オブジェクトがJSONでシリアル化されたクライアントに送り返されるようにします。 最後に、例外をスローする方法の例を示すダミーコントローラーを以下に示します。
@Controller
public class MainController {

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

}

4. 結論

この投稿では、Springで例外を処理する方法を示しました。 さらに、JSONでシリアル化されたクライアントにそれらを送信する方法を示しました。
この記事の完全な実装は、https://github.com/eugenp/tutorials/tree/master/spring-boot-data [Github上]にあります。 これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。