Spring MVC在没有请求映射时如何处理异常?

问题描述:

当控制器中的所有请求映射与传入请求不匹配时会发生什么?我正在使用捕获Exception.class的异常处理程序,但似乎没有捕获它?谁能解释一下?Spring MVC在没有请求映射时如何处理异常?

+0

如果你有两个映射,一个用于root'/',另一个用于'/ api',它会做最接近的匹配。只有API会被/ api处理,但是/和其他人会匹配我相信的根。然后,你可以处理任何你喜欢它/。你有没有尝试过 ? – bhantol

+0

是的,目前它正在做一个GET请求,但因为没有映射(所有都是POST请求映射)我想知道如何捕获错误/异常(无论是将它导向到HTTP 400页面)而不是请求映射GET –

+0

如果我正确理解你。如果出现未映射的请求,则结果将是一个包含404状态码的页面。也许你没有正确实现你的处理程序。如果你的项目包含web.xml,你可以使用''标签来配置它;如果它基于注释配置视图相关的帖子:http://*.com/questions/13356549/handle-error-404-with-spring-controller,如果你使用的是spring引导,定义bean'EmbeddedServletContainerCustomizer'并且在那里配置错误页面,您将在控制器中处理。 – GVArt

根据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的视图,并根据需要显示异常信息。