Spring BootでREST APIを0から学ぼう!例外処理404 Not Foundに対応

spring restful
Spring restful サービスを、実際にプロジェクトを作成するところから記録していきます。 細かく記録してますので、新たにspring restfulを学ぼうとしている方には、きっと参考になると思います。 ところどころでエラーがでた場合も、それも含めて記録してあります。 新たにspring restfulを学ぼうとしている方の役に立てられたら幸いです。

あらっ!?

間違えて、存在しないはずのデータにアクセスしちゃった!

だけどエラーが表示されないわ

どうしてかしら?

このままじゃまずいわね

前回までの状態では、実は存在しないデータにアクセスしてもエラーが発生しません。

エラーどころか、ステータスが200 OKになってしまいます。

例えば、下記のように、idが1000000にもかかわらず、ステータスが200 OKになっていることがわかります。

 

今回は例外処理をどうやって行うのかを学んでいきましょう!

ところで、実際のコードはどうだったかというと

対象の記事は前々回になります。

このコードに例外処理を追加していきますね

例外処理に対応してみる。404 Not Foundをハンドリング

開発環境は以下のようになっています。
OS: Mac
IDE: STS→ダウンロード先はこちら
Java: java8
spring boot: 2.1.3.RELEASE

まずは下記のような「UserNotFoundException」クラスを作成します。

親クラスの「RuntimeException」クラスにエラーメッセージを送るだけの簡単なものです。

 

次に「retrieveUser」メソッドを下記のように修正します。

userの値がnullの場合、UserNotFoundExceptionをスローします。

 

では実際に存在しないidにアクセスしてみましょう。

表示が「500 internal Server Error」となりましたね。エラーメッセージも表示されています。

ただ、上記ではエラーコードが「500」になっていますが、

実際のエラー内容は対象のidのリソースが見つからないことが原因のはずです。

もう少しわかりやすくコードを修正します。

追加部分は@ResponseStatus(HttpStatus.NOT_FOUND)です。

 

これで「404 Not Found」エラーの表示になりました。こちらのほうがわかりやすいですよね

 

では次に応用として例外をどうやってカスタマイズしたらいいのかを学びましょう。

例外処理のカスタマイズの方法

まずは「ExceptionResponse」というBeanクラスを作成します。

内容は「日付」「メッセージ」「詳細」をプロパティに持っています。

これらをエラー発生時に返却できるようにしてみます。

 

そして下記のような「CustomizedResponseeintityExceptionHandler」を作成します。

このままでは分かりづらいので、少し補足しますね

コードを確認しながら読みすすめてくださいね

@ControllerAdviceを設定することにより、すべてのコントローラクラスで発生した例外に対して共通の処理を設定できるようになります。

さらに

ResponseEntityExceptionHandlerを継承することにより、@ExceptionHandlerにて「UserNotFoundException」でのエラーを取得できるようになります。

@ExceptionHandler(UserNotFoundException.class)

この部分ですね

 

「handleUserNotFoundException」メソッドの引数には、「UserNotFoundException」クラスと、「WebRequest」クラスを設定しています。

WebRequestのドキュメントによると

Webリクエストの汎用インターフェイス。主に一般的なWebリクエストインターセプターを対象としており、実際のリクエストの処理ではなく、一般的なリクエストメタデータへのアクセスを提供します。

 

下記の部分を詳しく解説していきますね

はじめの引数には、エラーの発生日時を設定します。

二番目には、UserNotFoundException発生時のメッセージが設定されています。

UserResourceコントローラクラス内での下記の部分のことです。

 

そして3番目の引数には、リクエストされたURIを設定しています。

参考:getDescription( boolean )
このリクエストの短い説明を取得します。通常、リクエストURIとセッションIDが含まれています。

 

では、実際にエラーが発生するとどうなるのかやってみましょう!

存在しない「id=1000000」にアクセスします。

 

上記のように表示されます。

先程のエラーの表示と比べてみると違うことがわかると思います。

 

今回は例外処理のハンドリングに関して解説しました。

うまくいったでしょうか?

次回はデータの削除方法を学んでいきましょう!

コメント

タイトルとURLをコピーしました