1. 程式人生 > >Spring MVC異常處理SimpleMappingExceptionResolver

Spring MVC異常處理SimpleMappingExceptionResolver

bean pri 分享圖片 ESS bsh trace 內部實現 ont per

Spring MVC異常處理SimpleMappingExceptionResolver【轉】

技術分享圖片(2012-12-07 13:45:33) 技術分享圖片轉載
標簽:

雜談

分類: 技術分享

Spring3.0中對異常的處理方法一共提供了兩種:一種是使用HandlerExceptionResolver接口;一種是在Controller類內部使用@ExceptionHandler註解。使用第一種方式可以實現全局異常控制,並且Spring已經提供了一個默認的實現類SimpleMappingExceptionResolver;使用第二種方式可以在Controller內部實現更個性化點異常處理方式,靈活性更高。一般來說,項目中只需要采用第一種方式就可以了,每個人都自己定義異常的展現方式,太過個性了,不統一。

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

基於HandlerExceptionResolver接口的異常處理:

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

示例代碼:

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

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

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頁面必須在那個頁面下,到時候如果找不到頁面,可以根據錯誤提示再調整頁面路徑

基於@ExceptionHandler的異常處理:

該方法需要定義在Controller內部,然後創建一個方法並用@ExceptionHandler註解來修飾用來處理異常,這個方法基本和 @RequestMapping修飾的方法差不多,只是可以多一個類型為Exception的參數,@ExceptionHandler中可以添加一個或多個異常的類型,如果為空的話則認為可以觸發所有的異常類型錯誤。

示例代碼:

Java代碼 技術分享圖片
  1. @Controller
  2. public class ExceptionHandlerController {
  3. @ExceptionHandler(value={IOException.class,SQLException.class})
  4. public String exp(Exception ex,HttpServletRequest request) {
  5. request.setAttribute("ex", ex);
  6. return "/error.jsp";
  7. }
  8. }
來源:http://blog.sina.com.cn/s/blog_61e6c583010161kt.html

Spring MVC異常處理SimpleMappingExceptionResolver