Springboot默认的错误页是如何工作及工作原理你肯定不知道?

环境:Springboot2.4.12

环境配置

接下来的演示都是基于如下接口进行。

@RestController
@RequestMapping("/exceptions")
public class ExceptionsController {

  @GetMapping("/index")
  public Object index(int a) {
    if (a == 0) {
      throw new BusinessException() ;
    }
    return "exception" ;
  }

}

默认错误输出

默认情况下,当请求一个接口发生异常时会有如下两种情况的错误信息提示

  • 基于HTML

图片图片

  • 基于JSON

图片图片

上面两个示例通过请求的Accept请求头设置希望接受的数据类型,得到不同的响应数据类型。

标准web错误页配置

在标准的java web项目中我们一般是在web.xml文件中进行错误页的配置,如下:


  /error

如上配置后,如发生了异常以后容器会自动地跳转到错误页面。

Spring实现原理

在Springboot中没有web.xml,并且Servlet API也没有提供相应的API进行错误页的配置。那么在Springboot中又是如何实现错误页的配置呢?

Springboot内置了应用服务,如Tomcat,Undertow,Jetty,默认是Tomcat。那接下来看下基于默认的Tomcat容器错误页是如何进行配置的。

  • Servlet Web服务自动配置
@EnableConfigurationProperties(ServerProperties.class)
@Import({ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class, 
         ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,...})
public class ServletWebServerFactoryAutoConfiguration {
  @Configuration(proxyBeanMethods = false)
  @ConditionalOnClass({ Servlet.class, Tomcat.class, UpgradeProtocol.class })
  @ConditionalOnMissingBean(value = ServletWebServerFactory.class, search = SearchStrategy.CURRENT)
  static class EmbeddedTomcat {

    // 这里主要就是配置Web 容器服务,如这里使用的Tomcat
    // 注意该类实现了ErrorPageRegistry ,那么也就是说该类可以用来注册错误页的
    @Bean
    TomcatServletWebServerFactory tomcatServletWebServerFactory(
      ObjectProvider connectorCustomizers,
      ObjectProvider contextCustomizers,
      ObjectProvider