SpringMVCグローバル例外処理の方法は何ですか?
さらに関連情報が必要な方は、ホームページのプロフィールをご覧ください!
JavaEEプロジェクトの開発では、基盤となるデータベース操作プロセス、ビジネス層の処理プロセス、または制御層の処理プロセスのいずれであっても、さまざまな予測可能および予測不可能な例外に対処する必要があります。各プロセスは例外を個別に処理し、システムのコード結合度が高く、ワークロードが大きく、統合されておらず、メンテナンスのワークロードも大きくなっています。
SpringMvcは、例外処理のサポートを提供します。SpringMvcが提供するグローバルな例外処理メカニズムにより、すべてのタイプの例外処理を各処理プロセスから切り離すことができます。これにより、関連する処理プロセスの単一機能が保証されるだけでなく、例外も実現されます。統合処理および情報の保守。
SpringMVCグローバル例外処理の3つの方法
-
SpringMVCが提供する単純な例外ハンドラSimpleMappingExceptionResolverを使用します。
-
Springの例外処理インターフェースHandlerExceptionResolverを実装して、独自の例外ハンドラーをカスタマイズします。
-
@ExceptionHandlerアノテーションを使用して、例外処理を実現します。
ケースプラクティス
グローバル例外処理方法1
SimpleMappingExceptionResolverオブジェクトを構成します
<bean class="org.springframework.web.servlet.handler.SimpleMappingException Resolver">
<property name="defaultErrorView" value="error"></property>
<property name="exceptionAttribute" value="ex"></property>
<property name="exceptionMappings">
<props>
<prop key="com.xxx.exception.BusinessException">error1</prop>
<prop key="com.xxx.exception.ParamsException">error2</prop>
</props>
</property>
</bean>
SimpleMappingExceptionResolverを例外処理に使用すると、統合が簡単で、スケーラビリティが高く、既存のコードへの侵入がないという利点がありますが、このメソッドは例外情報しか取得できません。例外が発生した場合は、例外以外のデータを取得する必要があります。状況は当てはまりません。 。
グローバル例外処理方法2
HandlerExceptionResolverインターフェースを実装する
@Component
public class GlobalException implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
Map<String,Object> map=new HashMap<String, Object>();
map.put("ex", ex);
ModelAndView mv=null;
if(ex instanceof ParamsException){
return new ModelAndView("error_param", map);
}
if(ex instanceof BusinessException){
return new ModelAndView("error_business", map);
}
return new ModelAndView("error", map);
}
}
例外処理にHandlerExceptionResolverインターフェイスを実装する例外ハンドラーを使用すると、統合が簡単で、スケーラビリティが高く、既存のコードに侵入しないという利点があります。同時に、例外処理中に例外の原因となったオブジェクトを取得できるため、有益です。より詳細な例外処理情報を提供します。
グローバル例外処理方法3
ページプロセッサはBaseControllerを継承します
public class BaseController {
@ExceptionHandler
public String exc(HttpServletRequest request,HttpServletResponse
response,Exception ex){
request.setAttribute("ex", ex);
if(ex instanceof ParamsException){
return "error_param";
}
if(ex instanceof BusinessException){
return "error_business";
}
return "error";
}
}
@ExceptionHandlerアノテーションを使用して例外処理を実現することには、単純な統合、優れた拡張性(例外処理用のControllerクラスのみをBaseControllerから継承する必要がある)、追加のSpring構成がないなどの利点がありますが、このメソッドは既存のコードに侵入します(関連するクラスがBaseControllerから継承するように既存のコードを変更する必要があり、例外処理中に例外以外のデータを取得できません。
拡張〜キャッチされない例外処理
Unchecked Exceptionの場合、コードは強制的にキャプチャされないため、無視されることがよくあります。UncheckedExceptionが実行時に生成され、コードがキャプチャされてそれに応じて処理されない場合、恥ずかしい404、500に直面する必要があります...サーバーの内部エラープロンプトページ。包括的で効果的な例外処理メカニズムが必要です。現在、ほとんどのサーバーは、(Websphere / Weblogic)または(Tomcat)ノードを介したWeb.xml内の特定の異常表示ページの構成もサポートしています。web.xmlファイルを変更し、次のコンテンツを追加します。
<!-- 出错页面定义 -->
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/500.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>