本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接
通常我们在Spring Boot中设置的统一异常处理(
@RestControllerAdvice
配合
@ExceptionHandler
实现)只能处理Controller抛出的异常。有些请求还没到Controller就出异常了,而这些异常不能被统一异常捕获,例如Servlet容器的某些异常。今天我在项目开发中就遇到了一个,这让我很不爽,因为它返回的错误信息格式不能统一处理,我决定找个方案解决这个问题。
ErrorPageFilter
这类图相信大家没少见,Spring Boot 只要出错,体现在页面上的就是这个。如果你用Postman之类的测试出了异常则是:
{
"timestamp": "2021-04-29T22:45:33.231+0000",
"status": 500,
"message": "Internal Server Error",
"path": "foo/bar"
}
复制代码
这个是怎么实现的呢?Spring Boot在启动时会注册一个
ErrorPageFilter
,当Servlet发生异常时,该过滤器就会拦截处理,将异常根据不同的策略进行处理:
当异常已经在处理的话直接处理,否则转发给对应的错误页面
。有兴趣的可以去看下源码,逻辑不复杂,这里就不贴了。