私のプロジェクト上のコントローラのすべてが使用する一つの基地コントローラから延びる@ExceptionHandler
注釈を。私は現在使用していることは、スプリングは私置き換えることによって、自分のプロジェクトを更新しようとして導入することを例外処理するための新しい方法よりも少し年上であると見てExceptionHandler
、最新で注釈をResponseStatusException
クラスを。
それを適切に行う方法上の任意のヒント?
我々は掘り下げる前にResponseStatusException
、のは、すぐに見てみましょう@ResponseStatusの注釈を。この注釈は、HTTPレスポンスにHTTPステータスコードを適用するための春3で導入されました。
私たちは、HTTP応答のステータスと理由を設定する@ResponseStatusアノテーションを使用することができます。
@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "Actor Not Found")
public class ActorNotFoundException extends Exception {
// ...
}
HTTPリクエストを処理している間に、この例外がスローされた場合、レスポンスはこの注釈で指定されたHTTPステータスが含まれます。
@ResponseStatusアプローチの欠点の1つは、それが例外との緊密な結合を作成することです。この例では、型ActorNotFoundExceptionのすべての例外は、応答で同じエラーメッセージとステータスコードを生成します。
ResponseStatusException
ResponseStatusExceptionは@ResponseStatusへのプログラムの代替であり、HTTPレスポンスにステータス・コードを適用するために使用される例外の基本クラスです。それはのRuntimeExceptionだ、したがって明示的メソッドシグネチャに追加する必要はありません。
春はResponseStatusExceptionを生成するために、3つのコンストラクタを提供します。
ResponseStatusException(HttpStatus status)
ResponseStatusException(HttpStatus status, java.lang.String reason)
ResponseStatusException(
HttpStatus status,
java.lang.String reason,
java.lang.Throwable cause
)
ResponseStatusException、コンストラクタの引数:
- ステータス - HTTPレスポンスにHTTPステータスセット
- 理由 - HTTP応答に例外セットを説明するメッセージ
- 原因 - ResponseStatusExceptionのThrowableの原因
注:春、HandlerExceptionResolverインターセプトとは、任意の例外が発生し、コントローラによって処理されないプロセス。
これらのハンドラの一つ、ResponseStatusExceptionResolver、任意のResponseStatusExceptionまたは@ResponseStatusで注釈を付けキャッチされない例外を探し、HTTPステータスコード&理由を抽出し、HTTPレスポンスでそれらを含んでいます。
ResponseStatusExceptionのメリット
ResponseStatusExceptionの使用量は、いくつかの利点があります。
- まず、同じタイプの例外は別々に処理することができ、異なるステータスコードが密結合を低減、応答に設定することができます
- 第二に、それは不必要な追加の例外クラスの作成を回避します
- 例外はプログラムで作成することができるよう最後に、それは、例外処理をより細かく制御を提供します
春5はResponseStatusExceptionクラスを導入しました。私たちは、必要に応じて理由や原因をはhttpStatusを提供し、そのインスタンスを作成することができます。
@GetMapping("/actor/{id}")
public String getActorName(@PathVariable("id") int id) {
try {
return actorService.getActor(id);
} catch (ActorNotFoundException ex) {
throw new ResponseStatusException(
HttpStatus.NOT_FOUND, "Actor Not Found", ex);
}
}
ResponseStatusExceptionを使用することの利点は何ですか?
- プロトタイピングのための優れた:私たちは、非常に高速の基本的なソリューションを実装することができます
- 一つのタイプは、複数のステータスコード:一つの例外の種類は、複数の異なる応答につながることができます。これは@ExceptionHandlerに比べてタイトな結合を低減します
- 我々は、多くのカスタム例外クラスを作成する必要はありません
- 例外処理をより細かく制御の例外はプログラムで作成することができますので、
そして、何のトレードオフについて?
- 例外処理の統一方法はありません:グローバルなアプローチを提供し@ControllerAdviceとは対照的に、それは、いくつかのアプリケーション全体の規則を施行することはより困難です
- コードの重複:私たちは、複数のコントローラのコードを複製自分自身を見つけることができます
我々はまた、それは一つのアプリケーション内の異なるアプローチを組み合わせることが可能だということに注意してください。
たとえば、私たちは、グローバル@ControllerAdviceを実装するだけでなく、ResponseStatusExceptionsローカルにすることができます。しかし、我々は注意する必要があります。同じ例外は複数の方法で処理することができれば、我々はいくつかの驚くべき行動に気づくことがあります。可能性条約は、一方通行に常に例外の一つの特定の種類を処理することです。