ErrorPageFilter
当我们访问页面的处理逻辑抛出异常未处理之后,可以发现日志中会打印
ERROR [http-nio-10002-exec-22] --- ErrorPageFilter: Forwarding to error page from request [xxx] due to exception xxx
打开ErrorPageFilter后可以发现他来自及基本的包
默认加载,且最优先
看下具体的处理逻辑
现在我们可以看出来了,如果不设置一些特殊的异常和状态值处理的话,那应该就走
global,那么这个全局的是哪来的呢。
上边两个是系统里自定义设置,下边那个应该就是系统自动加载得了,打开看看
ErrorMvcAutoConfiguration
这是一个自动加载的配置类,看到这个名字,感觉就找对地方了,在内部类的ErrorPageCustomizer.customize()进行了注入,看看这个
是一个自动加载的属性类,那我们可以知道这个默认的地址是可以在配置文件中自定义的,现在可以猜测下是
server.error.path了,打开ErrorProperties这个类看看对不对
果然不出意外的话,还是出意外了,他的配置是
error.path默认值是/error,好吧,那我们就知道默认的跳转地址是/error了。但是问题来了。我们没有配置@RequestMapping("/error")这个的入口,为什么页面能自动跳转呢。
BasicErrorController
这个Config类中的这个类很可疑啊,一看就像是请求的入口类,打开看下
果然啊,就在这里,这个${server.error.path:${error.path:/error}}一看闭环了不是这。跟刚才的ErrorProperties的取值对应上了不是。到这里就闭环了不是。默认的跳转地址是/error,默认的页面名称是error,如果是ftl,那么文件就是error.ftl。
知道了文件,我们可以看看可以取到啥值
总结下
status error message exception trace(server.error.include-stacktrace=always或者请求中携带参数trace=1)
如何自定义ErrorPage
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
return container -> container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/404"));
}