2014-09-06 86 views
1

使用Spring 2.5.6,我的SimpleMappingExceptionResolver正是如此配置的SimpleMappingExceptionResolver僅適用於某些例外

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 
    <property name="exceptionMappings"> 
     <props> 
      <prop key="MismatchException">error/mismatch-error</prop> 
      <prop key="Exception">error/${module.render.error.logical.page}</prop> 
      <prop key="IllegalArgumentException">error/module-illegal-arg</prop> 
      <prop key="MissingServletRequestParameterException">error/module-illegal-arg</prop> 
     </props> 
    </property> 
</bean> 

的想法是,對於拋出:IllegalArgumentException和MissingServletRequestParameterException,我希望有一個稍微不同的錯誤屏幕,並且還的HTTP狀態代碼400返回。

IllegalArgumentException的效果很好,引用的JSP將狀態正確設置爲400. MissingServletRequestParameterException不起作用,而是出現通用的500錯誤。

回答

1

幾個小時後,認爲web.xml中可能存在錯誤/ module-illegal-arg.jsp或可能需要其他配置的錯誤,我跳入調試器並將其追溯到getDepth()方法在SimpleMappingExceptionResolver.java中。

基本上,它將Exception條目與MissingServletRequestParameterException相匹配。雖然Exception是超級類,但人們會認爲這種方法更喜歡直接匹配幾個級別的匹配。實際上,這是getDepth()的全部目的。上線366給出了最後的線索:

if (exceptionClass.getName().indexOf(exceptionMapping) != -1) { 

所以基本上,例外是任何類在名稱中的工作匹配的異常,在深度爲0級。

那麼,爲什麼IllegalArgumentException異常並且MissingServletRequestParameterException沒有?底層存儲是一個HashTable。 IllegalArgumentException散列到比Exception更早的值。異常散列爲比MissingServletRequestParameterException更早的值。

最終的解決辦法:

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 
    <property name="exceptionMappings"> 
     <props> 
      <prop key="MismatchException">error/mismatch-error</prop> 
      <!-- 
       The full path is here in order to prevent matches on every class with the word 
       'Exception' in its class name. The resolver will go up the class hierarchy and will 
       still match all derived classes from Exception. 
      --> 
      <prop key="java.lang.Exception">error/${module.render.error.logical.page}</prop> 
      <prop key="IllegalArgumentException">error/module-illegal-arg</prop> 
      <prop key="MissingServletRequestParameterException">error/module-illegal-arg</prop> 
     </props> 
    </property> 
</bean> 
相關問題