Java SpringMVC 異常處理SimpleMappingExceptionResolver類詳解
Spring3.0 對異常的處理方式總共有兩種:
一種是使用 HandlerExceptionResolver 接口,並且 Spring 已經提供默認的實現類 SimpleMappingExceptionResolver。
第二種方法是在 Controller 內部實現,靈活性更高。
從目前的調查結果來看,這兩種方式不能共存。我們一般在項目中使用第一種方法。
下面分別描述一下這兩種使用方式:
一、基於 HandlerExceptionResolver 接口的方式
使用這種方式隻需要實現 resolveException 方法,該方法返回一個 ModelAndView 對象,在方法內部對異常的類型進行判斷,然後返回合適的 ModelAndView 對象,如果該方法返回瞭 null,則 Spring 會繼續尋找其他的實現瞭 HandlerExceptionResolver 接口的 Bean。換句話說,Spring 會搜索所有註冊在其環境中的實現瞭 HandlerExceptionResolver 接口的 Bean,逐個執行,直到返回瞭一個 ModelAndView 對象。
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 配置文件中,或者使用 @Component 標簽,讓 Spring 管理它。同時 Spring 也提供默認的實現類 SimpleMappingExceptionResolver,需要使用時隻需要使用註入到 Spring 配置文件進行聲明即可。自定義實現類與默認的實現類,可同時使用。
示例如下:
<!-- 自定義的實現類 --><bean id="exceptionHandler" class="com.enh.test.CustomExceptionHandler"/><!-- 默認的實現類註入 --><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!-- 為所有的異常定義默認的異常處理頁面,exceptionMappings未定義的異常使用本默認配置 --> <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>
一個典型的異常顯示界面如下:
<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 中的,具體可以查看源代碼。
另外這裡配置的異常顯示界面均僅包括主文件名,至於文件路徑和後綴已經在 viewResolver 中指定。如果找不到頁面,會根據錯誤提示再調整頁面路徑。
二、Controller 內部單獨實現
該方法需要定義在 Controller 內部,然後創建一個方法並用 @ExceptionHandler 註解來修飾用來處理異常,這個方法基本和 @RequestMapping 修飾的方法差不多,隻是可以多一個類型為 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"; } }
三、相關問題
HandlerExceptionResolver 和 web.xml 中配置的 error-page 會有沖突嗎?
web.xml 中配置 error-page 同樣是配置出現錯誤時顯示的頁面:
<error-page> <error-code>500</error-code> <location>/500.jsp</location> </error-page>
如果 resolveException 返回瞭 ModelAndView,會優先根據返回值中的頁面來顯示。不過,resolveException 可以返回 null,此時則展示 web.xml 中的 error-page 的500狀態碼配置的頁面。
API 文檔中對返回值的解釋:
return a corresponding ModelAndView to forward to, or null for default processing.
到此這篇關於SpringMVC 異常處理SimpleMappingExceptionResolver類詳解的文章就介紹到這瞭,更多相關SpringMVC 異常處理SimpleMappingExceptionResolver類內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- SpringMVC全局異常處理的三種方式
- 詳解Spring MVC的攔截器與異常處理機制
- SpringMVC基於配置的異常處理器
- 詳解SpringBoot異常處理流程及原理
- Java SpringMVC異常處理機制詳解