如何在没有 web.xml 的情况下捕获 DispatcherServlet 上下文中的 Spring PageNotFound 异常?

How to catch Spring PageNotFound exception in DispatcherServlet context without web.xml?

我正在尝试捕获所有 spring MVC 错误并显示自定义错误页面,以避免显示本机 Tomcat 页面。

我正在尝试使用多个 @ExceptionHandler,例如:

@ExceptionHandler(Exception.class)
@ExceptionHandler(RuntimeException.class)
@ExceptionHandler(Throwable.class)

但 404 始终会转换为本机 Tomcat 页面(其他异常映射有效)。

我在 @ControllerAdvice 中的异常处理程序在请求不存在的 URL 期间从未被调用,我收到这样的日志消息:

o.s.w.s.PageNotFound WARN   - No mapping found for HTTP request with URI [/websandbox/asdas] in DispatcherServlet with name 'dispatcher'

如何避免从 spring 上下文回退到本机 Tomcat 错误页面?

我的调度程序 servlet 映射到 /(不是 /*

不,我没有抛出自定义异常 - 此异常是在请求未映射时生成的 url,例如 /knloqtnqklnwejlfnqw

未映射的资源将始终在部署描述符中被拒绝,并且它将是 web.xml。

  1. 您需要配置 web.xml 以将这些错误抛给特定的 URL say /404
  2. 现在您需要将这些 url 映射到可以执行必要操作的控制器。

How to configure custom errors in Spring MVC本文展示了如何做到这一点。

我希望这就是您需要做的全部。

如果您想对 class 使用 @ExceptionHandler,您可以参考 this article。然而,我并不觉得它很有说服力,但它仍然会帮助你映射 NOT_FOUND 异常和来自控制器的其他异常。

实际上,我通过诊断 DispatcherServlet 来源找到了确切的解决方案。我们需要为调度程序 servlet 指定 init-param:

<init-param>
            <param-name>throwExceptionIfNoHandlerFound</param-name>
            <param-value>true</param-value>
 </init-param>

所以,404 是非常特殊的情况。