环境: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