springmvc三種全局異常處理


其實自己一直有想把自己的項目弄的越簡潔越好,不用把項目中每個方法看起來比較臃腫,所以自己沒事就去論壇,博客看別人怎么整合

今天特意寫一些自己上個項目中用到的異常全局攔截處理

springmvc有三種方式

1.使用springmvc提供簡單異常處理器simpleMappingException

2.實現spring的異常處理接口handleerExceptionResolver自定義處理異常

3.使用 @ExceptionHandler注解實現遺產處理

SimpleMappingExceptionResolver:

springMVC-servlet.xml

[html]  view plain  copy
  在CODE上查看代碼片 派生到我的代碼片
  1. <beanclassbeanclass="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  
  2.   定義默認的異常處理頁面,當該異常類型的注冊時使用  
  3.   <property name="defaultErrorView" value="error">  
  4.   </property>  
  5.   定義異常處理頁面用來獲取異常信息的變量名,默認名為exception  
  6.   <propertynamepropertyname="exceptionAttribute"value="ex"></property>  
  7.   定義需要特殊處理的異常,用類名或完全路徑名作為key,異常也頁名作為值  
  8.   <property name="exceptionMappings">  
  9.   <props>  
  10.   <propkeypropkey="etc.exception.MyException">error-my</prop>  
  11.   這里還可以繼續擴展對不同異常類型的處理  
  12.   </props>  
  13.   </property>  
  14.  </bean>   


HandlerExceptionResolver :

[java]  view plain  copy
  在CODE上查看代碼片 派生到我的代碼片
  1. public class MyExceptionHandler{  
  2.       
  3.     @ExceptionHandler  
  4.     public ModelAndView resolveException(HttpServletRequest request,  
  5.             HttpServletResponse response, Object handler, Exception ex) {  
  6.         Map<String, Exception> map = new HashMap<String, Exception>();  
  7.         map.put("ex",ex);  
  8.           
  9.         // 根據獲取的Exception參數進行view跳轉  
  10.         if (ex instanceof MyException) {  
  11.             return new ModelAndView("error-my",map);  
  12.         } else {  
  13.             return new ModelAndView("error",map);  
  14.         }  
  15.     }  
  16. }  
定義了這樣一個異常處理器之后就要在springMVC-servlet.xml中定義這樣一個bean對象,如
[html]  view plain  copy
  在CODE上查看代碼片 派生到我的代碼片
  1. <bean id="myExceptionHandler" class="com.tiantian.xxx.web.handler.myExceptionHandler"/>  

使用@ExceptionHandler進行處理:

使用@ExceptionHandler進行處理有一個不好的地方是進行異常處理的方法必須與出錯的方法在同一個Controller里面

如:

[java]  view plain  copy
  在CODE上查看代碼片 派生到我的代碼片
  1. import org.springframework.stereotype.Controller;     
  2. import org.springframework.web.bind.annotation.ExceptionHandler;     
  3. import org.springframework.web.bind.annotation.RequestMapping;     
  4.     
  5. import com.tiantian.blog.web.servlet.MyException;     
  6.     
  7. @ExceptionHandler
    @ResponseBody
    public String exp(HttpServletRequest request, Exception ex) {
    request.setAttribute("ex", ex);
    // 根據不同錯誤轉向不同頁面
    if(ex instanceof NullPointerException) {
    return CtrUtils.toWxResultFormat(12133, "NullPointerException異常:" + ex.getMessage());
    }else if(ex instanceof IllegalArgumentException ) {
    logger.error("ParameterException exception異常");
    return CtrUtils.toWxResultFormat(12134, "ParameterException exception異常");
    }else if (ex instanceof org.springframework.web.multipart.MaxUploadSizeExceededException){
    return CtrUtils.toWxResultFormat(10113, "圖片大小不能超過5M");
    }else {
    return CtrUtils.toWxResultFormat(12135,ex.getMessage());
    }
    }
  8.   

這里在頁面上訪問test方法的時候就會報錯,而擁有該test方法的Controller又擁有一個處理該異常的方法,這個時候處理異常的方法就會被調用

當發生異常的時候,上述兩種方式都使用了的時候,第一種方式會將第二種方式覆蓋

這個項目中我使用了第三種,並且在每個controller中繼承這個 GlobalController ,實現整個項目的全局異常攔截

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: