如何在Spring启动中拦截嵌入式Tomcat上的”全局” 404

How to intercept “global” 404s on embedded Tomcats in spring-boot

spring-boot附带的嵌入式tomcat存在一个相当奇怪的问题,特别是它的错误处理。

基本上,我正在尝试通过自定义处理程序处理所有异常。
长话短说:它适用于除404之外的所有内容。是否通过其他机制而不是通过异常处理?

我测试过的所有其他状态代码称为自定义解析器,只有404呈现给我默认的Tomcat 404页面。更具体地说,将404扔到控制器外部,例如如果仅注册了/ test的控制器,则请求/ teXst。在这种例外情况下,我不会调用我的解析器,而只会看到默认的Tomcat HTTP Status 404页面。

有什么想法会阻碍我前进吗?
这是我设置我的Resolver

的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class GlobalExceptionResolver extends AbstractHandlerExceptionResolver {
        @Override
        public int getOrder() {
            return Integer.MIN_VALUE;
        }

        @Override
        protected boolean shouldApplyTo(HttpServletRequest request, Object handler) {
            return true;
        }

        @Override
        protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
     // my stuff ending with returning an instance of ModelAndView
    }

要获得所有默认的Spring-Boot错误处理方式,而不用我用

进行注释的方式

1
@EnableAutoConfiguration(exclude = org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration.class)

这使我拥有404、500等的默认Tomcat错误页面,最后使用

设置了我的自定义处理程序

1
2
3
4
5
6
7
@Bean
public WebMvcConfigurerAdapter adapter() {
    return new WebMvcConfigurerAdapter() {
        @Override
        public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
            exceptionResolvers.add(new GlobalExceptionResolver());
        }

如前所述,该设置对于HTTP状态404以外的所有异常都可以正常工作。任何想法都可以通过什么机制创建这些页面,以及为什么不调用我的异常解析器?这是在使用Spring MVC 4.1.7.RELEASE和嵌入式Tomcat 8.0.23

的Spring Boot 1.2.5.RELEASE上


事实证明,我找到了答案。无法通过Spring Configuration进行操作,但是您可以创建自己的ServletDispatcher并将其配置为引发异常,如下所述:如何配置默认的DispatcherServlet?

然后我上面的代码捕获了404s