Spring MVC在没有请求映射时如何处理异常?
问题描述:
当控制器中的所有请求映射与传入请求不匹配时会发生什么?我正在使用捕获Exception.class的异常处理程序,但似乎没有捕获它?谁能解释一下?Spring MVC在没有请求映射时如何处理异常?
答
根据documentation@ExceptionHandler
处理控制器执行期间发生的意外异常。在传入请求不匹配任何请求映射的情况下,控制器方法甚至不会被执行。
基于Servlet技术的Spring-MVC。所有传入请求将由DispatcherServlet
(在web.xml
中注册)处理。 DispatcherServlet
查找可处理当前请求的处理程序。如果没有找到适当的处理程序(即没有找到适当的映射控制器的方法),DispatcherServlet
将启动404错误。 发生错误时,Web容器(Tomcat或任何其他servlet容器)会生成一个包含异常消息的默认页面。但是你也可以指定容器应该为给定的异常返回一个特定的错误页面。对于处理此错误手动你应该加入到web.xml
新error-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
的视图,并根据需要显示异常信息。
如果你有两个映射,一个用于root'/',另一个用于'/ api',它会做最接近的匹配。只有API会被/ api处理,但是/和其他人会匹配我相信的根。然后,你可以处理任何你喜欢它/。你有没有尝试过 ? – bhantol
是的,目前它正在做一个GET请求,但因为没有映射(所有都是POST请求映射)我想知道如何捕获错误/异常(无论是将它导向到HTTP 400页面)而不是请求映射GET –
如果我正确理解你。如果出现未映射的请求,则结果将是一个包含404状态码的页面。也许你没有正确实现你的处理程序。如果你的项目包含web.xml,你可以使用''标签来配置它;如果它基于注释配置视图相关的帖子:http://stackoverflow.com/questions/13356549/handle-error-404-with-spring-controller,如果你使用的是spring引导,定义bean'EmbeddedServletContainerCustomizer'并且在那里配置错误页面,您将在控制器中处理。 –
GVArt