Spring MVC異常処理メカニズム例詳細


前言
Spring MVCでは、一つの要求に異常が発生した時、Dispactch Servletは委託方式で一つの処理チェーンに渡してこの投げられた異常を処理または解析します。これはrequestとServlet Continerの間の障壁です。ここでいくつかの処理作業ができます。例えば、変換異常、友好的なerror pageやhttp状態コードなどに変換します。
コアインターフェース
この処理機構はSpringにおいて、HandlerException Resoulverインターフェースを中心としています。このインターフェースは一つの処理方法しかありません。

ModelAndView resolveException(
 HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);
戻り値ModelAndViewには、次のような約束があります。
  • ModelAndViewは一つのページ
  • を指す。
  • 空のModelAndViewは、異常はすでにHandlerException Resoloverの内部処理が完了したと表しています。
  • nullは異常未処理を示しています。他のHandlerException Resolover
  • を実行し続ける必要があります。
    複数のHandlerException Resoulver beanを声明することによって、Orderedインターフェースを実現して、順番があるHandlerException Resoliver chainを構成して、異常を処理します。
    Springは以下のいくつかの実装を提供しています。
  • SimpleMappingException Resolover 処理ロジックは、Exceptionのクラスnameに基づいて指定されたerror pageにマッピングされます。
  • Default HandlerException Resolaverは、異常なタイプによってhttp状態コードに変換されます。
  • ResponseStorts Exception Resoliverは、異常とステータスコードを@ResonseStutsによって結びつけることによって、異常がある場合は、最終的にクライアントに対応するステータスコードを返す。
  • Exception HandlerException Resoloverは@Exception Handlerを処理する解析類で、異常が発生したら@Exception Handler方法に渡します。
  • 処理ロジック
    ExceptionResoloverに対する処理はDispactch Servletで行われます。
    Displatch Servletには属性があります。これは前述のchainを表します。
    
    /** List of HandlerExceptionResolvers used by this servlet */
    private List<HandlerExceptionResolver> handlerExceptionResolvers;
    Displatch Servletを初期化すると同時に、handle Exception Resoliversを初期化しました。

    それはアプリConteetからすべてのHandlerException Resolaver beanを調べて、そして並べ替えて、上の方は初期化の仕事です。
    processHandlerException方法で完成したHandlerException Resoulver chainへの呼び出しは、戻り値がnullではなく、処理完了と見なします。
    
    // Check registered HandlerExceptionResolvers...
      ModelAndView exMv = null;
    for (HandlerExceptionResolver handlerExceptionResolver : this.handlerExceptionResolvers) {
       exMv = handlerExceptionResolver.resolveException(request, response, handler, ex);
      if (exMv != null) {
        break;
        }
      }
    カスタム異常プロセッサは、HandlerException Resoloverを実現してもいいし、AbstractHandlerException Resoliverクラスを継承してもいいです。
    ここでは、機能が最も豊富なException Handler Exception Resoloverを重点的に説明します。
    @Exception Handlerによる注釈の方法は、Exception Handler Exception Resoloverによって処理されたものとみなされます。この方法でサポートされているパラメータの種類は、以下の通りです。
  • Exception
  • Request/Resonse
  • Session
  • WebRequest or NativeRequest
  • java.util.Local
  • java.io.InputStream/java.io.Reader
  • java.io.OutputStream/java.io.Writer
  • org.springframe ewark.ui.Model
  • サポートされている戻り値の種類は、以下の通りです。
  • ModelAndView object(Servlet MVC or Portlet MVC).
  • org.springframe ewark.ui.Model
  • java.util.Map object for exposing a model
  • org.springframe ew.web.servlet.View.
  • String value which is interpreted as view name.
  • @ResonseBody  メッセージ体は、message convertersを通じて、内容協議によって変換することができます。
  • Http Entity<?>or ResonseEntity<?>
  • voidが、Resonseを介して直接メッセージ・ストリームを書き込む場合、この方法は、void
  • に戻ることができる。
    @Exception Handler@Controller Adviceはグローバル異常プロセッサとして使用できます。
    
    @ControllerAdvice
    public class GlobalExceptionController {
     @ExceptionHandler(CustomGenericException.class)
     public ModelAndView handleCustomException(CustomGenericException ex) {
    ModelAndView model = new ModelAndView("error/error");
      model.addObject("code”, ex.getErrCode());
      model.addObject(“msg”, ex.getErrMsg());
      return model;
     }
     @ExceptionHandler(Exception.class)
     public ModelAndView handleAllException(Exception ex) {
      ModelAndView model = new ModelAndView("error/error");
      model.addObject(“msg”, "this is Exception.class");
      return model;
     }
    }
    以上はSpring MVCの中の異常な処理のロジックで、もし間違いがあるならば、れんがをたたくことを歓迎します。
    締め括りをつける
    以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。