Spring Boot 开发的web应用,默认情况下如果发生异常将会有一个简易的页面显示错误信息,这个显示页面比较简陋,那么我们如何定制错误信息显示页面呢?
以下的例子模板引擎都是选择的freemarker。
简单的说:Spring Boot 内置了一个controller,类名:BasicErrorController,默认注册的url为 /error。
因此
1、如果我们想简单定制错误页面,只需在templates下 建立一个名为 error.ftl 文件。
2、如果我们想根据不同的HTTP错误状态码显示不同的错误页面,只需在templates下 建立目录error,然后在其下建立对应的文件
如 404,就建立404.ftl 500 就建立500.ftl
如果想对同一系列状态码使用相同的页面 如 5xx 就建立 5xx.ftl
其中原理,只需查看 BasicErrorController 源码即可。简单的说,它是根据Http错误状态码和模板引擎类型进行查找的,
以404为例,查找的顺序如下:
'/<templates>/error/404.<ext>'
'/<static>/error/404.html'
'/<templates>/error/4xx.<ext>'
'/<static>/error/4xx.html'
如果都没有,就使用Spring Boot默认提供的,即在 ErrorMvcAutoConfiguration 中配置的 defaultErrorView
与下图对应
那么,为什么BasicErrorController 中设置error视图与这个名叫error的bean 有关呢?
这是因为spring mvc 的视图解析器(根据一个视图名称解析找到对应的View)中有一个叫BeanNameViewResolver,结合这些信息,可以知道它最终到的View实现是SpelView 。
(到这里,我们也就明白了Spring boot 默认错误页上的内容为什么是那样的了)
Spring mvc 使用View的render进行内容渲染输出。我们可以在SpelView的render方法中打一个断点,看看调用栈。