2010-06-03 53 views
3

我正在玩SimpleMappingExceptionResolver來查看它是如何工作的,看看它對我們來說是否對客戶有用,但是我在理解時遇到問題。Spring SimpleMappingExceptionResolver不會進入默認視圖

我試過的是訪問我的應用程序中的特定頁面,並讓它在handleRequestInternal方法中拋出異常。

當我拋出一個RecoverableDataAccessException(DataAccessException的子類),然後正確的錯誤頁面按預期顯示。

當我拋出一個freemarker.core.InvalidReferenceException或java.lang.NumberFormatException異常泡沫通過頁面和默認的500錯誤頁面(即沒有樣式)顯示。

下面是我使用的映射。

<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 
    <property name="exceptionMappings"> 
     <props> 
      <prop key="org.springframework.dao.DataAccessException">/general/error/500</prop> 
      <prop key="freemarker.core.InvalidReferenceException">/general/error/500</prop> 
      <prop key="NumberFormatException">/general/error/500</prop> 
     </props> 
    </property> 
    <property name="defaultErrorView" value="/general/error/500" /> 
</bean> 

我至少期望默認的錯誤視圖來獲取異常,並顯示我的具體錯誤頁面,但沒有發生。

我在這裏正確使用SimpleMappingExceptionHandler嗎?

我正在使用碼頭。

我意識到SMER不會處理渲染過程中拋出的錯誤,這就解釋了爲什麼它無法捕捉到我特別遇到的錯誤。 SMER能否應付500種風格錯誤?

回答

9

正如您發現的那樣,SimpleMappingExceptionResolver不適用於視圖圖層中引發的異常。它實現了接口HandlerExceptionResolver,顧名思義,它只處理處理程序(即控制器)拋出的異常。

如果您需要處理視圖引發的異常,您可以編寫HandlerInterceptor,覆蓋afterCompletion()方法或編寫非Spring servlet Filter。在這兩種情況下,你都不會得到Spring的視圖解析器的好處,你必須自己處理渲染。

但是,當你在視圖層獲得異常時,並不總是可以正常處理它們,因爲服務器可能已經開始在拋出異常時將視圖輸出刷新到客戶端,這種情況下,服務器無法再呈現單獨的錯誤頁面。這就是爲什麼在控制器層中儘可能多地執行邏輯的好習慣,以便儘可能早地捕獲異常。

+1

這真的是很好的建議 - 謝謝 – Rachel 2010-06-08 10:16:24