異常なグローバル統一のSpringBoot取り扱い

 

要求が異常であるか、エラーが後端を発生した場合、フロントエンドは、一般に、以下に示します

ホワイトレーベルのエラーページは、
このアプリケーションは、何も持っていない、明示的なマッピングのためにあなたが見ているので、/エラーをこの ようフォールバック。

金ジュン07  153807 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は、インターセプト法、異常な異なる傍受複数のクラスを定義することができる、異常情報が、より大きな自由度をスロー取得することができます。

おすすめ

転載: www.cnblogs.com/lgjlife/p/10988439.html