春のグローバル例外処理に関する注意

グローバルコントローラーレイヤーの例外処理には、@ ControllerAdvice + @ExceptionHandlerを使用します。適切に設計されている限り、コントローラーレイヤーを試してキャッチする必要はありません。さらに、@検証済みの異常チェック注釈を一緒に処理できます。手動で結果をチェックする必要はなく、BindingResult /エラーをバインドすることが決定され ます。
デメリット
:データチェックと異常異常コントローラー単一レイヤー、テンプレートコードの削減、コーディング量の削減、スケーラビリティと保守性を向上させます。
短所:例外処理コントローラーはレイヤーをキャプチャ(キャストアウト)できず、異常なインターセプター(インターセプター)レイヤーの場合、レイヤーの異常なSpringフレームワークは何もできません
2つの基本的な使用例
@ControllerAdviceアノテーションはグローバル例外ハンドラークラスを定義します
@ControllerAdvice
public class GlobalExceptionHandler {
}
このGlobalExceptionHandlerクラスをスキャンしてSpringコンテナにロードできることを確認してください。
@ ExceptionHandlerアノテーションは例外処理メソッドを宣言します
@ControllerAdvicepublic
class GlobalExceptionHandler {


    @ExceptionHandler(Exception.class)
    @ResponseBody
    String handleException(){
        return "Exception Deal!";
    }
}
handleException()メソッドは、ControllerレイヤーとそのサブクラスによってスローされたすべてのExceptionを処理します。これが最も基本的な使用法です。 @Target(ElementType.METHOD)の
@ExceptionHandlerメソッドに注釈が付けられたパラメーターリスト
@Retention
(RetentionPolicy.RUNTIME)
@Documented
public @interface ExceptionHandler {


    / **
      * at処理された例外とメソッドによって注釈が付けられます。空の場合はデフォルトで任意の
      メソッドの引数リストに記載されている*例外
      * /
    <?のThrowableが延びる>クラス[]の値()デフォルト{};


}
処理される例外のタイプを@ExceptionHandler注釈で宣言されていない場合、それはにデフォルト設定されますパラメータリストの例外タイプ
@ControllerAdvicepublic
class GlobalExceptionHandler {


    @ExceptionHandler()
    @ ResponseBody
    String handleException(Exception E){
        return "Exception Deal!" + E.getMessage();
    }
}
パラメータオブジェクト例外オブジェクトがスローされます
研磨層サービスでのコントローラ層 3の処理サービス異常
パッケージビジネス例外クラス:
public class BusinessException extends RuntimeException {


    public BusinessException(String message){
        super(message);
    }
} サービス実装クラス @Service public class DogService { @Transactional public Dog update(Dog dog){ //いくつかのデータベースオプション //シミュレートされた犬の新しい名前他の犬の名前と競合します BSUtil.isTrue(false、 "犬の名前はすでに使用されています..."); //データベースの犬の情報を更新します





   
   


       


       
       


       


        returndog ;
    }


}
補助ツールクラスBSUtilpublic
static void isTrue(boolean expression、String error){
    if(!expression){
        throw new BusinessException(error);
    }
}
GlobalExceptionHandlerクラスでビジネス例外クラスを宣言し、対応するその後、処理はユーザーに返されます。実際のプロジェクトに近いコード
/ **
 * 2017/4/10にkinginblueによって作成されました。
 * @ ControllerAdvice + @ ExceptionHandlerはグローバルコントローラーレイヤーの例外処理を実装します
 * /
@ControllerAdvice
public class GlobalExceptionHandler {


    private static final Logger LOGGER =LoggerFactory。getLogger( GlobalExceptionHandler.class);


    / ***
     すべての     不明な例外を処理します * @ param
     e
* @return
     * /
    @ExceptionHandler(Exception.class)
    @ResponseBody
    AppResponse handleException(Exception e){
        LOGGER.error(e.getMessage()、e);


        AppResponse応答=新しいAppResponse();
        response.setFail( "操作失败!");
        応答を返します。
    }


    / **
     *異常所有业务异常
     * @ param e
     * @return
     * /
    @ExceptionHandler(BusinessException.class)
    @ResponseBody
    AppResponse handleBusinessException(BusinessException e){
        LOGGER.error(e.getMessage()、e);


        AppResponse応答=新しいAppResponse();
} 注:@NotNull、@Min、及び@NotBlankの使用は、この記事の範囲を超えています。あなたがそれに精通していないならば、学ぶために情報を見つけてください。 その他の指示:

























@Dataアノテーションは、** Lombok **プロジェクトのアノテーションであり、コードにゲッターとセッターを手動で追加する手間を省くことができます。
EclipseおよびIntelliJIDEAで使用する場合は、関連するプラグインもインストールする必要があります。この手順は、Google / Baiduに対して自分で行います。 :SpringMVCで安らかのJSONインターフェースのため、結合および検証データは次の通りである / **  *例グローバルハンドルコントローラ層例外にGlobalExceptionHandlerを用い  * @param犬  * @return  * / @PatchMapping(値=「」) AppResponseをupdate(@Validated(Update.class)@RequestBody Dog dog){     AppResponse resp = new AppResponse();     //ビジネス    ドッグを実行 newDog = dogService.update(dog);     //データを     返すresp.setData(newDog);     respを返す; } 達成するには@ Validated + @ RequestBodyアノテーションを使用します。






















@Validated + @RequestBodyアノテーションが使用されているが、バインドされたデータオブジェクトの後にErrorsタイプのパラメーター宣言がない場合、SpringMVCフレームワークはMethodArgumentNotValidExceptionをスローします。


したがって、GlobalExceptionHandlerにMethodArgumentNotValidException例外の宣言と処理を追加することで、データ検証例外をグローバルに処理できます
/ **
 * 2017/4/10にkinginblueによって作成されました。
 * @ ControllerAdvice + @ ExceptionHandlerはグローバルコントローラーレイヤー例外を実現します処理
 * /
@ControllerAdvice
public class GlobalExceptionHandler {


    private static final Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionHandler.class);


    / ***
     すべての     不明な例外を処理します * @ param
     e
* @return
     * /
    @ExceptionHandler(Exception。class)
    @ResponseBody
    AppResponse handleException(Exception e){
        LOGGER.error(e.getMessage()、e);


        AppResponse応答=新しいAppResponse();
        response.setFail( "操作失败!");
        応答を返します。
    }


    / **
     *異常所有业务异常
     * @ param e
     * @return
     * /
    @ExceptionHandler(BusinessException.class)
    @ResponseBody
    AppResponse handleBusinessException(BusinessException e){
        LOGGER.error(e.getMessage()、e);


        AppResponse応答=新しいAppResponse();
        response.setFail(e.getMessage());
        応答を返します。
    }


    /      ***
     すべてのインターフェイスデータ検証例外を処理します * @ param
     e
* @return
     * /
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    AppResponse handleMethodArgumentNotValidException(MethodArgumentNotValidException e){
        LOGGER.error(e.getMessage()、e);


        AppResponse応答= new AppResponse();
        response.setFail(e.getBindingResult()。getAllErrors()。get(0).getDefaultMessage());
        return response;
    }
}


ここで理解する:controllerAdviceおよびExceptionHandlerアノテーションを介してグローバル例外ハンドラーを定義するコントローラ層のすべての例外は、インターセプトされた例外タイプを区別し、それに応じて処理できます
   たとえば、エラーログの印刷と例外へのわかりやすい応答(ここでは、例外クラスをカスタマイズでき、RuntimeExceptionを継承して、エラーコードやエラー情報フィールドの追加などの例外の属性をカスタマイズできます。例外情報はRuntimeExceptionから継承できます)ここでの
   応答はサブパッケージ化できます。Resposeオブジェクトのフィールドはそれぞれ(成功ブールタイプ、errorCode、errorMsg、およびデータオブジェクトタイプ)です。

おすすめ

転載: blog.csdn.net/u011445756/article/details/80174683