Spring 3 MVC異常処理

2853 ワード

Spring 3 MVC異常処理
Spring 3.0における異常な処理方法は全部で2つ提供されています.一つはHandlerException Resoliverインターフェースを使用しています.一つは、Controller類の内部で@Exception Handlerを使用します.最初の方法を使用してグローバル異常制御を実現し、Springはデフォルトの実装クラスSimpleMappingException Resoloverを提供しました.第二の方式を使うと、Controller内部でよりパーソナライズされた点異常処理方式が実現でき、柔軟性がより高い.一般的に、プロジェクトの中では最初の方式を採用すればいいです.一人一人が異常な表現方式を定義しています.個性的すぎて、統一されていません.
現在の調査結果から見ると、この2つの方法は共存できないので、未来のバージョンが彼らを一つにすることができるかどうかは分かりません.HandlerException Resoloverインターフェースに基づく異常処理:
このような方法を使うには、resoloveException方法だけが必要であり、この方法はModelAndViewオブジェクトに戻り、方法の内部で異常なタイプを判断し、よくある適切なModelAndViewオブジェクトが必要であり、この方法がnullに戻ったら、Springは他のHandlerException Resoliverインターフェースを実現したBeanを探し続けます.言い換えれば、Springは、その環境に登録されたすべてのデバイスを検索して、HandlerException ResolaverインターフェースのBeanを実現し、ModelAndViewオブジェクトに戻るまで一つ一つ実行します.
**
 *   HandlerExceptionResolver        
 */
public class CustomExceptionHandler implements HandlerExceptionResolver {
     
    @Override
    public ModelAndView resolveException(HttpServletRequest request,
            HttpServletResponse response, Object object, Exception exception) {
        if(exception instanceof IOException){
            return new ModelAndView("ioexp");
        }else if(exception instanceof SQLException){
            return new ModelAndView("sqlexp");
        }
        return null;
    }
     
}
このクラスはSpringに宣言して、Springに管理させて、@Componentタグを使ってもいいです.簡単な異常処理のために、SpringはSimpleMappingException Resolover類を提供しています.このクラスはHandlerException Resoliverインターフェースを実現しています.必要な時はノードだけを使って声明すればいいです.例は以下の通りです.
<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="IOException">error/ioexp</prop>
<prop key="java.sql.SQLException">error/sqlexp</prop>
</props>
</property>
</bean>
@Exception Handlerの異常処理に基づいて、この方法はController内部で定義され、そして一つの方法を作成し、@Exception Handlerで注釈を修飾して異常を処理する必要があります.この方法は基本的に@Request Mapping修飾の方法と似ています.ただし、一つのタイプはExceptionのパラメータです.空であれば、すべての異常タイプのエラーがトリガされると思います.
サンプルコード:
/**
 *   @ExceptionHandler    
 */
@Controller
public class ExceptionHandlerController {
         
    @ExceptionHandler(value={IOException.class,SQLException.class})
    public String exp(Exception ex,HttpServletRequest request) {
        request.setAttribute("ex", ex);
        return "/error.jsp";
    }
     
}