如何在没有 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。
- 您需要配置 web.xml 以将这些错误抛给特定的 URL say /404
- 现在您需要将这些 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 是非常特殊的情况。
我正在尝试捕获所有 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。
- 您需要配置 web.xml 以将这些错误抛给特定的 URL say /404
- 现在您需要将这些 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 是非常特殊的情况。