Spring MVCで異常処理を統一して実戦で
4556 ワード
http://cgs1999.iteye.com/blog/1547197
Simple MappingException Resoloverを使って異常処理を実現します。
1、Springのプロファイルaplication Contact.xmlに以下の内容を追加します。
HandlerException Resoloverインターフェースのカスタマイズ異常プロセッサを実現します。
1
Javaコード コレクションコードは、HandlerException Resoloverインターフェースの実現タイプMyException Handlerを追加しました。コードは以下の通りです。
@Exception Handlerを使って、異常処理を実現します。
1、BaseController類を追加し、クラスの中で@Exception Handlerコメントを使って異常処理を行います。コードは下記の通りです。
捕獲異常なしの処理
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の注釈方式を使用することを推奨します。
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の注釈方式を使用することを推奨します。