グローバルコントローラーレイヤーの例外処理には、@ 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、およびデータオブジェクトタイプ)です。
デメリット
:データチェックと異常異常コントローラー単一レイヤー、テンプレートコードの削減、コーディング量の削減、スケーラビリティと保守性を向上させます。
短所:例外処理コントローラーはレイヤーをキャプチャ(キャストアウト)できず、異常なインターセプター(インターセプター)レイヤーの場合、レイヤーの異常な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、およびデータオブジェクトタイプ)です。