1

當控制器中的所有請求映射與傳入請求不匹配時會發生什麼?我正在使用捕獲Exception.class的異常處理程序,但似乎沒有捕獲它?誰能解釋一下?Spring MVC在沒有請求映射時如何處理異常?

+0

如果你有兩個映射,一個用於root'/',另一個用於'/ api',它會做最接近的匹配。只有API會被/ api處理,但是/和其他人會匹配我相信的根。然後,你可以處理任何你喜歡它/。你有沒有嘗試過 ? – bhantol

+0

是的,目前它正在做一個GET請求,但因爲沒有映射(所有都是POST請求映射)我想知道如何捕獲錯誤/異常(無論是將它導向到HTTP 400頁面)而不是請求映射GET –

+0

如果我正確理解你。如果出現未映射的請求,則結果將是一個包含404狀態碼的頁面。也許你沒有正確實現你的處理程序。如果你的項目包含web.xml,你可以使用''標籤來配置它;如果它基於註釋配置視圖相關的帖子:http://stackoverflow.com/questions/13356549/handle-error-404-with-spring-controller,如果你使用的是spring引導,定義bean'EmbeddedServletContainerCustomizer'並且在那裏配置錯誤頁面,您將在控制器中處理。 – GVArt

回答

1

根據documentation@ExceptionHandler處理控制器執行期間發生的意外異常。在傳入請求不匹配任何請求映射的情況下,控制器方法甚至不會被執行。

基於Servlet技術的Spring-MVC。所有傳入請求將由DispatcherServlet(在web.xml中註冊)處理。 DispatcherServlet查找可處理當前請求的處理程序。如果沒有找到適當的處理程序(即沒有找到適當的映射控制器的方法),DispatcherServlet將啓動404錯誤。 發生錯誤時,Web容器(Tomcat或任何其他servlet容器)會生成一個包含異常消息的默認頁面。但是你也可以指定容器應該爲給定的異常返回一個特定的錯誤頁面。對於處理此錯誤手動你應該加入到web.xmlerror-page元素,將讓你的錯誤代碼映射到網址:

... 

<servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<error-page> 
    <error-code>404</error-code> 
    <location>/page-not-found</location> 
</error-page> 

... 

因爲location將被Spring-MVC將照常處理要求,您可以創建控制器來處理這個請求:

@Controller 
public class ExceptionController{ 

    @RequestMapping("/page-not-found") 
    public ModelAndView pageNotFound(){ 
     return new ModelAndView("page-not-found"); 
    } 

} 

現在只需創建名稱爲page-not-found.jsp的視圖,並根據需要顯示異常信息。