Spring对于访问页面时发生异常的处理

566 阅读2分钟

ErrorPageFilter

当我们访问页面的处理逻辑抛出异常未处理之后,可以发现日志中会打印

ERROR [http-nio-10002-exec-22] --- ErrorPageFilter: Forwarding to error page from request [xxx] due to exception xxx

打开ErrorPageFilter后可以发现他来自及基本的包

image.png 默认加载,且最优先 class.png 看下具体的处理逻辑 跳转.png 现在我们可以看出来了,如果不设置一些特殊的异常和状态值处理的话,那应该就走global,那么这个全局的是哪来的呢。

add.png

image.png 上边两个是系统里自定义设置,下边那个应该就是系统自动加载得了,打开看看

ErrorMvcAutoConfiguration

config.png

这是一个自动加载的配置类,看到这个名字,感觉就找对地方了,在内部类的ErrorPageCustomizer.customize()进行了注入,看看这个

proper.png 是一个自动加载的属性类,那我们可以知道这个默认的地址是可以在配置文件中自定义的,现在可以猜测下是server.error.path了,打开ErrorProperties这个类看看对不对

err.png 果然不出意外的话,还是出意外了,他的配置是error.path默认值是/error,好吧,那我们就知道默认的跳转地址是/error了。但是问题来了。我们没有配置@RequestMapping("/error")这个的入口,为什么页面能自动跳转呢。

BasicErrorController

这个Config类中的这个类很可疑啊,一看就像是请求的入口类,打开看下

contr.png

果然啊,就在这里,这个${server.error.path:${error.path:/error}}一看闭环了不是这。跟刚才的ErrorProperties的取值对应上了不是。到这里就闭环了不是。默认的跳转地址是/error,默认的页面名称是error,如果是ftl,那么文件就是error.ftl。 知道了文件,我们可以看看可以取到啥值

msg.png

总结下

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"));
}