spring exception

Spring MVC異常處理SimpleMappingExceptionResolver【轉】

  (2012-12-07 13:45:33)
標籤: 

雜談

分類: 技術分享

 

Spring3.0中對異常的處理方法一共提供了兩種:一種是使用HandlerExceptionResolver接口;一種是在Controller類內部使用@ExceptionHandler註解。使用第一種方式能夠實現全局異常控制,而且Spring已經提供了一個默認的實現類SimpleMappingExceptionResolver;使用第二種方式能夠在Controller內部實現更個性化點異常處理方式,靈活性更高。通常來講,項目中只須要採用第一種方式就能夠了,每一個人都本身定義異常的展示方式,太過個性了,不統一。html

 

從目前的調查結果看,這兩種方式不能共存,不知道將來的版本是否能將他們合二爲一,這樣才能靈活配置。java

基於HandlerExceptionResolver接口的異常處理:

使用這種方式只須要實現resolveException方法,該方法返回一個ModelAndView對象,在方法內部對異常的類型進行判斷,而後常見合適的ModelAndView對象,若是該方法返回了null,則Spring會繼續尋找其餘的實現了HandlerExceptionResolver 接口的Bean。換句話說,Spring會搜索全部註冊在其環境中的實現了HandlerExceptionResolver接口的Bean,逐個執行,直到返回了一個ModelAndView對象。web

示例代碼:spring

Java代碼  
  1.   
  2. public class CustomExceptionHandler implements HandlerExceptionResolver {  
  3.   
  4.     @Override  
  5.     public ModelAndView resolveException(HttpServletRequest request,  
  6.             HttpServletResponse response, Object object, Exception exception) {  
  7.         if(exception instanceof IOException){  
  8.             return new ModelAndView("ioexp");  
  9.         }else if(exception instanceof SQLException){  
  10.             return new ModelAndView("sqlexp");  
  11.         }  
  12.         return null;  
  13.     }  
  14.   
  15. }  

這個類必須聲明到Spring中去,讓Spring管理它,你可使用@Component標籤,也可使用<bean/>節點。爲了簡單的進行異常處理,Spring提供了SimpleMappingExceptionResolver類,該類實現了HandlerExceptionResolver接口,須要使用時只須要使用<bean/>節點進行聲明便可,示例以下:sql

Xml代碼  
  1. <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  
  2.     <!-- 定義默認的異常處理頁面,當該異常類型的註冊時使用 -->  
  3.     <property name="defaultErrorView" value="error"></property>  
  4.     <!-- 定義異常處理頁面用來獲取異常信息的變量名,默認名爲exception -->  
  5.     <property name="exceptionAttribute" value="ex"></property>  
  6.     <!-- 定義須要特殊處理的異常,用類名或徹底路徑名做爲key,異常也頁名做爲值 -->  
  7.     <property name="exceptionMappings">  
  8.         <props>  
  9.             <prop key="IOException">error/ioexp</prop>  
  10.             <prop key="java.sql.SQLException">error/sqlexp</prop>  
  11.         </props>  
  12.     </property>  
  13. </bean>  
經過SimpleMappingExceptionResolver咱們能夠將不一樣的異常映射到不一樣的jsp頁面(經過exceptionMappings屬性的配置),同時咱們也能夠爲全部的異常指定一個默認的異
常提示頁面(經過defaultErrorView屬性的配置),若是所拋出的異常在exceptionMappings中沒有對應的映射,則Spring將用此默認配置顯示異常信息(注意這裏配置的異常顯示界面均僅包括主文件名,至於文件路徑和後綴已經在viewResolver中指定)。

一個典型的異常顯示頁面以下: 
<html> 
<head><title>Exception!</title></head> 
<body> 
<% Exception ex = (Exception)request.getAttribute("exception"); %> 
<H2>Exception: <%= ex.getMessage();%></H2> 
<P/> 
<% ex.printStackTrace(new java.io.PrintWriter(out)); %> 
</body> 
</html> 
exception 實在SimpleMappingExceptionResolver 被存放到request中的,具體能夠查看源代碼。 
若是SimpleMappingExceptionResolver沒法知足異常處理的須要,咱們能夠針對 
HandlerExceptionResolver接口實現本身異常處理類,這一樣很是簡單(只須要實現一個 
resolveException方法)。 

若是有ViewResolver,則制定的jsp頁面必須在那個頁面下,到時候若是找不到頁面,能夠根據錯誤提示再調整頁面路徑app

 

基於@ExceptionHandler的異常處理:

該方法須要定義在Controller內部,而後建立一個方法並用@ExceptionHandler註解來修飾用來處理異常,這個方法基本和 @RequestMapping修飾的方法差很少,只是能夠多一個類型爲Exception的參數,@ExceptionHandler中能夠添加一個或多個異常的類型,若是爲空的話則認爲能夠觸發全部的異常類型錯誤。jsp

示例代碼:ide

Java代碼  
  1.   
  2. @Controller  
  3. public class ExceptionHandlerController {  
  4.       
  5.     @ExceptionHandler(value={IOException.class,SQLException.class})  
  6.     public String exp(Exception ex,HttpServletRequest request) {  
  7.         request.setAttribute("ex", ex);  
  8.         return "/error.jsp";  
  9.     }  
  10.   
  11. }  
相關文章
相關標籤/搜索