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