Spring MVCで異常処理を統一して実戦で

4556 ワード

http://cgs1999.iteye.com/blog/1547197
Simple MappingException Resoloverを使って異常処理を実現します。
1、Springのプロファイルaplication Contact.xmlに以下の内容を追加します。 
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  
    <!--            ,             -->  
    <property name="defaultErrorView" value="error"></property>  
    <!--                     ,    exception -->  
    <property name="exceptionAttribute" value="ex"></property>  
    <!--            ,           key,         -->  
    <property name="exceptionMappings">  
        <props>  
            <prop key="cn.basttg.core.exception.BusinessException">error-business</prop>  
            <prop key="cn.basttg.core.exception.ParameterException">error-parameter</prop>  
  
            <!--                     -->  
        </props>  
    </property>  
</bean>  
Simple MappingException Resoloverを使って異常処理を行い、統合が簡単で、良好な拡張性があり、既存のコードに侵入性がないなどの利点がありますが、この方法は異常情報のみ入手できます。異常が発生した場合、異常以外のデータを取得する必要がある場合は適用されません。
HandlerException Resoloverインターフェースのカスタマイズ異常プロセッサを実現します。
1
Javaコード  コレクションコードは、HandlerException Resoloverインターフェースの実現タイプMyException Handlerを追加しました。コードは以下の通りです。
public class MyExceptionHandler implements HandlerExceptionResolver {  
  
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,  
            Exception ex) {  
        Map<String, Object> model = new HashMap<String, Object>();  
        model.put("ex", ex);  
          
        //               
        if(ex instanceof BusinessException) {  
            return new ModelAndView("error-business", model);  
        }else if(ex instanceof ParameterException) {  
            return new ModelAndView("error-parameter", model);  
        } else {  
            return new ModelAndView("error", model);  
Xml                }  
    }  
}  
2、Springのプロファイルaplication Contact.xmlに以下の内容を追加します。 
<bean id="exceptionHandler" class="cn.basttg.core.exception.MyExceptionHandler"/>  
HandlerException Resoliverインターフェースを実現する異常プロセッサを使って異常処理を行い、統合が簡単で、良好な拡張性があり、既存のコードに侵入性がないなどの利点があります。また、異常処理時に異常が発生したオブジェクトを取得することができ、より詳細な異常処理情報を提供するのに役立ちます。
@Exception Handlerを使って、異常処理を実現します。
1、BaseController類を追加し、クラスの中で@Exception Handlerコメントを使って異常処理を行います。コードは下記の通りです。
public class BaseController {  
    /**   @ExceptionHandler     */  
    @ExceptionHandler  
    public String exp(HttpServletRequest request, Exception ex) {  
          
        request.setAttribute("ex", ex);  
          
        //               
        if(ex instanceof BusinessException) {  
            return "error-business";  
        }else if(ex instanceof ParameterException) {  
            return "error-parameter";  
        } else {  
            return "error";  
        }  
    }  
}  
2、コードを修正して、異常処理が必要なすべてのControllerにこのクラスを引き継がせます。以下のように修正したTestController類はBaseControllerに引き継がれます。 
public class TestController extends BaseController 
@Exception Handlerを使って異常処理を実現し、統合が簡単で、拡張性がある(異常処理するController類をBaseControllerに継承するだけでよい)、Spring配置などの利点が必要ではないが、この方法は既存のコードに侵入性がある(既存のコードを修正して、関連するクラスをBaseControllerに継承させる必要がある)。異常処理時は異常以外のデータは取得できません。
捕獲異常なしの処理
Uncecked Exceptionにとって、コードは強制的に捕獲されないので、無視されがちです。もし運行期間にUnicheced Exceptionが発生しても、コードの中には相応の捕獲と処理が行われていない場合、ばつの悪い404、500…などのサーバ内部エラーに直面してページを提示しなければならないかもしれません。
包括的で効果的な異常処理機構が必要である。現在はほとんどのサーバーもWeb.xmlにおいて<error-page>(Websphere/Weblogic)または<error-code>(Tomcat)ノードによって特定の異常状況を設定する表示ページをサポートしています。
締め括りをつける
上記を総合すると、Spring MVC統合異常処理の3つの方式は、統一異常処理の目標を達成することができます。3つの方法の長所と短所の比較から、簡単な統合異常処理だけが必要なら、SimpleMappingException Resoloverを使用することを推奨します。統合された異常処理が必要であれば、より個性的になり、ユーザーにより詳細な異常情報を提供し、HandlerException Resoulverインターフェースをカスタマイズする方法を勧めます。Springプロファイルが好きでない場合や「ゼロプロファイル」を実現し、既存のコードに適切な侵入を受けることができる場合は、@Exception Handlerの注釈方式を使用することを推奨します。