【问题标题】:Spring MVC how are exceptions handled when no request mapping?Spring MVC 在没有请求映射时如何处理异常?
【发布时间】:2017-05-17 01:20:55
【问题描述】:

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

【问题讨论】:

  • 如果您有两个映射,一个用于root /,另一个用于/api,它将进行最接近的匹配。只有 api 将由 /api 处理,但 / 和其他人将匹配我相信的根。然后你可以处理任何你喜欢它/。你试过了吗?
  • 是的,目前它正在执行 GET 请求,但因为没有映射,(所有都是 POST 请求映射)我想知道如何捕获错误/异常(无论导致它HTTP 400 页面)并且不为 GET 进行请求映射
  • 如果我理解正确的话。如果出现未映射的请求,结果将是带有 404 状态代码的页面。也许你没有正确实现你的处理程序。如果您的项目包含 web.xml,您可以使用 <error-page> 标签进行配置;如果它基于注释配置视图相关帖子:stackoverflow.com/questions/13356549/… 并且如果您使用的是 spring boot 定义 bean EmbeddedServletContainerCustomizer 并配置错误页面,您将在控制器中处理。

标签: spring exception model-view-controller error-handling exception-handling


【解决方案1】:

根据documentation@ExceptionHandler处理控制器执行过程中发生的意外异常。在传入请求不匹配任何请求映射的情况下,控制器方法甚至不会被执行。

Spring-MVC 基于 Servlet 技术。所有传入的请求都将由DispatcherServlet(注册在web.xml)处理。 DispatcherServlet 寻找可以处理当前请求的处理程序。如果找不到合适的处理程序(即找不到合适的映射控制器方法),DispatcherServlet 将启动 404 错误。 发生错误时,Web 容器(Tomcat 或任何其他 servlet 容器)会生成一个包含异常消息的默认页面。但是你也可以指定容器应该为给定的异常返回一个特定的错误页面。要手动处理此错误,您应该添加到 web.xml 新的 error-page 元素,这将允许您将错误代码映射到 url:

...

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 2015-06-18
    • 2012-06-20
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多