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

时间:2015-02-06 11:16:44

标签: java spring spring-mvc exception exception-handling

我正在尝试捕获所有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

2 个答案:

答案 0 :(得分:5)

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

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

所以,404是非常具体的案例。

答案 1 :(得分:0)

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

  1. 您需要配置web.xml以将这些错误抛出到特定的URL,例如/ 404
  2. 现在您需要将这些网址映射到可以采取必要措施的控制器。
  3. How to configure custom errors in Spring MVC本文介绍了如何执行此操作。

    我希望这就是你需要做的一切。

    如果您想对某个类使用@ExceptionHandler,可以参考this article。但是,我没有发现它非常有说服力,但它仍然可以帮助您映射NOT_FOUND异常和控制器中的其他异常。