天天看點

Spring MVC的異常統一處理方法

        我們經常需要統一配置項目的異常處理,又希望統一處理異常代碼,同時不侵入原有的正常代碼。我們可以通過以下三種方式實作統一處理項目的自定義異常。

      通過SimpleMappingExceptionResolver類實作自定義異常的統一處理

        通過實作比較簡單,隻需要進行bean配置即可

<!-- 對模型視圖名稱的解析,即在模型視圖名稱添加前字尾  -->
<bean id="jspViewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/exception" p:suffix=".jsp"></bean>

<!-- 配置SimpleMappingExceptionResolver異常處理-->
<bean name="exceptionResolver"  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="com.myproject.frame.exception.NotLoginException">login</prop>
            <!--<prop key="java.lang.Exception">errorPage</prop>-->
        </props>
    </property>
</bean>
           

        這種方式簡單并且具有良好的擴充性,對現有代碼沒有侵入性,但是除了異常資訊外,無法接收其他的額外的參數資訊。

       特别說明:errorPage.jsp和login.jsp的存放目錄必須在/WEB-INF/exception目錄中。模型視圖路徑必須與異常提示檔案的存放路徑保持一緻。

                           定義 <prop key="java.lang.Exception">errorPage</prop>講攔截所有的異常到自定義頁面。

      通過 實作HandlerExceptionResolver接口實作自定義異常的統一處理

  • 首先配置bean,支援模型視圖的解析
<!-- 對模型視圖名稱的解析,即在模型視圖名稱添加前字尾  -->
<bean id="jspViewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/" p:suffix=".jsp"></bean>
           
  • 實作HandlerExceptionResolver接口
public class ProjectExceptionHandler implements HandlerExceptionResolver {
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        /*定義model傳輸model到頁面*/
        Map<String, Object> model = new HashMap<String, Object>();
	model.put("ex", ex);
        return new ModelAndView("error", model);
    }
}
           

              ex為我們自定義的異常處理類,我們自定義一個ProjectException類

public class ProjectException extends RuntimeException {
    /** serialVersionUID */
    private static final long serialVersionUID = 2332608236621015980L;
           
    public ProjectException () {
        super();
    }

    public ProjectException (String message) {
        super(message);
    }
}
           

              當我們在代碼異常地方抛出異常時系統自動講異常顯示到自定義的異常頁面

throw new ProjectException("自定義異常頁面"); 
           

              采用這種方式不僅具有SimpleMappingExceptionResolver所有的有點,同時還可以額外傳遞參數。

       通過Spring的@ExceptionHandler注解實作異常統一處理

          看下面一個使用@ExceptionHandler 實作一個異常處理類

public class ExceptionController {
    /** 基于@ExceptionHandler異常處理 */
    @ExceptionHandler
    public String exp(HttpServletRequest request, Exception ex) {	
        /*要輸出的異常參數*/
        request.setAttribute("ex", ex);
        return "error";
    }
}
           

          使用@ExceptionHandler 實作異常統一處理的方式簡單,可擴充性強,隻需要實作一個類似控制器的類,就可以了,不需要額外spring配置,但是這種方式有一個缺點是必須講該類放在抛出異常的類同一個目錄下,否則無法起作用,不夠靈活,同時對于其他具有傾入性,對可能出現異常的地方需要繼承該類(ExceptionController )。

       異常提示的jsp檔案路徑

      定義異常jsp檔案的路徑,如果要放在web-inf外面

<prop key="com.rrtong.frame.exception.GuideTestException">../../exception/error-interface</prop>