種々の位置での春の例外処理

1.はじめに

一貫性のある例外は自明のアプリケーションの重要性のために取り扱います。今日はご紹介統一する方法をレスト例外処理を。同時に、我々は、単にそれらの間の長所と短所を比較します。

2. @Controller組み合わせ@ExceptionHandler

メソッド宣言した後で、コントローラ@ExceptionHandlerコメントタグであり得ます。

 @Controller
 @RequestMapping("/test")
 public class TestController {
  
     @RequestMapping("/err")
     @ResponseBody
     public Object demo1(){
         int i = 1 / 0;
         return new Date();
     }
  
     @ExceptionHandler({RuntimeException.class})
     public ModelAndView fix(Exception ex){
         System.out.println(ex.getMessage());
         return new ModelAndView("error",new ModelMap("ex",ex.getMessage()));
     }
 }复制代码

利点:

  • 最高の優先度。
  • @ExceptionHandlerメソッドをマークすると、複数の戻り値の型をサポートしています。ビューであってもよいし、それはすることができますjsonように。

短所:

  • ノート上の例外の型はそうでない場合は、同じように表示される実行時例外をスローすることはできません。Controller@ExceptionHandler
  • 明示的に例外処理の種類を宣言する必要があります。
  • スコープはちょうどあるController異常な本当の意味でのグローバルではありません。それはすべての親コントローラを置く世界的な必要性に基づいて行動する場合。

3. @ControllerAdvice組み合わせ@ExceptionHandler

これは、2定義することにより、改善された@ControllerAdviceクラスのメソッドをマークし、@ExceptionHandlerグローバルな例外ハンドラの目的を達成するために:

 @ControllerAdvice
 public class TestController {
 
  
     @ExceptionHandler({RuntimeException.class})
     public ModelAndView fix(Exception ex){
         System.out.println(ex.getMessage());
         return new ModelAndView("error",new ModelMap("ex",ex.getMessage()));
     }
 }复制代码

利点:

  • グローバル例外処理。
  • フルボディ制御応答ステータスコード、および
  • 異常の複数に対処する同じ方法にマッピングされ、それが更新さをフルに活用させる繧ResponseEntityの応答を

短所:

  • ノート上の例外の型はそうでない場合は、同じように表示される実行時例外をスローすることはできません。Controller@ExceptionHandler
  • 明示的に例外処理の種類を宣言する必要があります。

通常の状況下でも、このモードでは、例外処理を使用することをお勧めします。ほとんどの場合、それは互換性があります。

4. HandlerExceptionResolverインタフェース

実装HandlerExceptionResolverのインターフェイスを、ここではその抽象的実現を継承していますAbstractHandlerExceptionResolver

 @Component
 public class RestResponseStatusExceptionResolver extends AbstractHandlerExceptionResolver {
  
     @Override
     protected ModelAndView doResolveException(
       HttpServletRequest request, 
       HttpServletResponse response, 
       Object handler, 
       Exception ex) {
         try {
             if (ex instanceof IllegalArgumentException) {
                 return handleIllegalArgument((IllegalArgumentException) ex, response, handler);
             }
            //todo more exception
         } catch (Exception handlerException) {
               //todo 
         }
         return null;
     }
  
     private ModelAndView 
       handleIllegalArgument(IllegalArgumentException ex, HttpServletResponse response) 
       throws IOException {
         response.sendError(HttpServletResponse.SC_CONFLICT);
         String accept = request.getHeader(HttpHeaders.ACCEPT);
           //todo  more  response
         return new ModelAndView();
     }
 }复制代码

利点:

  • これは、グローバルな例外ハンドラです。
  • このようにグローバルな例外ハンドラが戻るJSPvelocityなど多くの便利なテンプレートビューなど。
  • これは、メソッドのオーバーライドを返すものの、応答形式の様々なサポートしていますModelAndViewが、パラメータがあるのでHttpServletResponse、我々は、応答結果をカスタマイズするためにそれを使用することができます。クライアントが要求した場合のために、例えばapplication / json、そのエラーが発生した場合、我々はに戻ることを確実にしたいapplication / jsonコード化された応答。

短所:

  • 私たちは下げる必要があるHttpServletResponse相互作用に対する応答体のさまざまな形態の実現を。
  • 低順位

5.春ブート例外処理

あなたは、フレームワークを使用している場合である春はブート我々はまた、独自のアプローチを使用することができます。利点は、APIの低レベルのシールドで、欠点も明らかである、特定の例外をキャプチャすることはできません。

5.1のErrorControllerを達成

春ブーツデフォルトでは、提供/error中のすべてのエラー処理するためのマッピングサーブレットを(コンテナがグローバルエラーページを登録します。エラーホワイトレーベル)とクライアントに返します。実装によってのErrorControllerインターフェースおよび登録ビーン例えば、もはやここに。あなたはを参照することができますBasicErrorController

5.2を追加 ErrorAttributes

また、追加することができますErrorAttributesのタイプのBeanのデフォルトの例外処理を置き換える交換します。

 @Component
 public class MyCustomErrorAttributes extends DefaultErrorAttributes {
  
     @Override
     public Map<String, Object> getErrorAttributes(
       WebRequest webRequest, boolean includeStackTrace) {
         Map<String, Object> errorAttributes = 
           super.getErrorAttributes(webRequest, includeStackTrace);
         errorAttributes.put("locale", webRequest.getLocale()
             .toString());
         errorAttributes.remove("error");
  
         //todo your business
  
         return errorAttributes;
     }
 }复制代码

5.3継承基本クラスBasicErrorController

スプリングブート自動構成は、例えば実装提供のErrorControllerの取り扱いベースインタフェース例外BasicErrorController、処理デフォルトテキスト/ HTMLリクエストの間違った種類を、ベースクラスは、要求タイプを処理する複数のカスタム継承、及び共通追加するために使用する方法もよい@RequestMappingアノテーションを農産物プロセスを指定する属性タイプ。

 @Component
 public class MyErrorController extends BasicErrorController {
  
     public MyErrorController(ErrorAttributes errorAttributes) {
         super(errorAttributes, new ErrorProperties());
     }
  
     @RequestMapping(produces = MediaType.APPLICATION_XML_VALUE)
     public ResponseEntity<Map<String, Object>> xmlError(HttpServletRequest request) {
          
     //todo your business
  
     }
 }复制代码

6.春5的ResponseStatusException

また、最新で春5あなたはまた投げることができるResponseStatusException例外を処理します。

利点:

  • 使用する方が便利
  • 、より多くのステータスコードを入力します。例外の種類が異なる様々な応答を引き起こす可能性があります。密結合を低減@ExceptionHandlerと比較すると、
  • 我々は、多くのカスタム例外クラスとして作成する必要はありません。
  • あなたがコントロール例外処理をより良くすることができるようにあなたは、プログラムで例外を作成することができますので、

短所:

  • 特定のアプリケーション全体の合意を強制するために、さらに困難例外処理のない均一な方法はありません
  • コードの重複がたくさんあるかもしれません。

7.まとめ

私たちは、一般的に珍しい使用春のメリットに分析し、まとめた例外を処理する方法を。私はあなたがあなたのために右である治療法を見つけることができると信じています。あなたは便利くださいヘルプのスポット、あなたの励まし、私のモチベーションを好きなら!

关注公众号:Felordcn获取更多资讯

個人的なブログます。https://felord.cn

おすすめ

転載: juejin.im/post/5dd1fbcff265da0bf175d51d