要求が異常であるか、エラーが後端を発生した場合、フロントエンドは、一般に、以下に示します
ホワイトレーベルのエラーページは、 このアプリケーションは、何も持っていない、明示的なマッピングのためにあなたが見ているので、/エラーをこの ようフォールバック。 金ジュン07 15:38:07 CST 2019 (タイプは予期しないエラーが発生しましたが見つかりませんでした=、ステータスは= 404 )。 利用できませんメッセージ
ユーザーのために、非常に非友好的。
この記事ではSpringBootアプリケーションで統一された例外処理を使用する方法について説明します。
実装
最初:@ControllerAdviceと@ExceptionHandlerコメントを使います
第二は、:のErrorControllerを実装するクラスを使用します。
最初:@ControllerAdviceと@ExceptionHandlerコメントを使います
@ SLF4J
@ControllerAdvice
パブリッククラス GlobalExceptionHandler {
@ResponseBody
@ExceptionHandler(。NullPointerExceptionがクラス)
公共 BaseResult globalException(HttpServletResponseの応答、 NullPointerExceptionがexは){
ログの.info("GlobalExceptionHandler ..." );
ログの.info(" 错误代码:" + response.getStatus());
BaseResult結果= 新しい WebResult(WebResult。RESULT_FAIL 、"リクエストエラー:" + response.getStatus()
、 " GlobalExceptionHandler:" + ex.getMessage()) 。
戻り値の結果;
}
}
ノート@ControllerAdviceは、コントローラクラスと定義された切片異常なクラスを満たすが、ブロックされるときに例外が発生し、このコントローラがクラスを増強であることを示しています。
パスのパケットが傍受コントローラ存在を定義することができます
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component パブリック @のインタフェースControllerAdvice { @AliasFor( "basePackages" ) の文字列[]の値()デフォルト{}。 @AliasFor( "値" ) 文字列[] basePackages()デフォルト{}。 クラス <?> [] basePackageClasses()デフォルト{}。 クラス <?> [] assignableTypes()デフォルト{}。 クラス <?延び注釈> []アノテーション()デフォルト} {。 }
ノートexceptionHandlerの定義された例外クラスの傍受
@Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented パブリック @のインタフェースexceptionHandlerの{ クラス <?延びたThrowable> []の値()デフォルト{}。 }
第二は、:のErrorControllerを実装するクラスを使用します。
BasicErrorControllerのためのクラスをデフォルトのエラー処理は、エラーページとして表示されます。
ここでは、クラスを扱う独自のエラーを記述し、プロセス上のデフォルトのクラスは動作しません。
getErrorPath()は、サーバへのパスがこの場合において、クラスに対応した処理経路にリダイレクトされ返しエラー方法。
@ SLF4J @RestController パブリック クラス HttpErrorController 実装のErrorController { 民間 最終 静的文字列ERROR_PATH =「/エラー」。 @ResponseBody @RequestMapping(パス = ERROR_PATH) 公衆BaseResult誤差(HttpServletRequestのリクエスト、HttpServletResponseの応答){ log.info( "访问/エラー" + "错误代码:" + response.getStatus())。 BaseResult結果 = 新しい WebResult(WebResult.RESULT_FAIL、 "HttpErrorControllerエラー:" + response.getStatus())。
戻り値の結果; } @Override パブリックストリングgetErrorPath(){ 戻りERROR_PATHと、 } }
テスト
上記で定義された、統一されたリターンクラスBaseResult、遠位端は、処理を容易にします。
パッケージcom.microblog.common.result。 インポートしたjava.io.Serializable; パブリック クラス BaseResultが実装シリアライズ{ プライベート 静的 最終 長いのserialVersionUID = 1L 。 パブリック 静的 最終 int型の RESULT_FAIL = 0 ; パブリック 静的 最終 int型の RESULT_SUCCESS = 1 ; // 返回代码 プライベート整数コード。 // 返回消息 プライベート文字列メッセージ。 // 返回对象 プライベート オブジェクトデータ; パブリックBaseResult(整数コード、文字列メッセージ){ この .CODE = コード。 この .message = メッセージ。 } 公共BaseResult(整数コード、文字列メッセージ、オブジェクトのオブジェクト){ この .CODE = コード。 この .message = メッセージ。 この .DATA = オブジェクト。 } パブリック整数にgetCode(){ 戻りコードと } 公共 ボイドSETCODE(整数コード){ この .CODE = コード。 } パブリックストリングのgetMessage(){ リターン・メッセージ、 } 公共 ボイドsetMessage(文字列メッセージ){ この .message = メッセージ。 } パブリックオブジェクトのgetData(){ 戻りデータ; } 公共 ボイドのsetData(オブジェクトデータ){ この .DATA = データ。 } }
テストコントローラを書きます
@ SLF4J @RestController @RequestMapping( "/ユーザ" ) パブリック クラスTestController { @RequestMapping( "/ INFO1" ) パブリック文字列試験(){ log.info( "/ユーザ/ INFO1" )。 スロー 新しい NullPointerExceptionが( "TestControllerが例外を持っています" ); } }
1.間違った要求、すなわち、該当する処理クラスを送信します。
リターンから見ることができるHttpErrorController型処理
{ "コード":0、 "メッセージ": "HttpErrorControllerエラー:404"、 "データ":NULL }
2.問題通常要求(TestController 試験()工程)、処理クラスは奇妙ヌルをスロー
それはリターンで見ることができるようにGlobalExceptionHandlerタイプの処理
{ "コード":0、 "メッセージ": "要求エラー:200"、 "データ": "GlobalExceptionHandler:TestController例外を持っています"}
違い
1.ノート@ControllerAdviceの十字キーはスローされた例外を処理することができます。この時、コントローラは、要求を入力しました。
2.クラスのErrorControllerの実施形態では、コントローラなどを入力していなかったエラーなど、404401、エラーを含め、すべての例外を処理することができます
3.両方のアプリケーションが共存する、場合@ControllerAdviceはコントローラによってスローされた例外を処理し、ベースのErrorControllerの実施形態は、異常なコントローラに入りません。
ControllerAdvice形態@ 4は、インターセプト法、異常な異なる傍受複数のクラスを定義することができる、異常情報が、より大きな自由度をスロー取得することができます。