Spring boot 处理 error 的基本流程:json
Controller -> 发生错误 -> BasicErrorController -> 根据 @RequestMapping(produces) 判断调用 errorHtml 或者 error 方法app
而后:spa
errorHtml -> getErrorAttributes -> ErrorViewResolver -> 错误显示页面code
error -> getErrorAttributes -> @ResponseBody (直接返回JSON)对象
若是想要定制一些东西,按照官方文档的建议能够:继承
1.继承 BasicErrorController 扩展处理一个新的 content type接口
2.自定义 ErrorAttributes 得到本身想要的结果集资源
3.实现 ErrorViewResolver 接口,自定义错误显示视图文档
Spring boot 默认使用 DefaultErrorViewResolver 做为 ErrorViewResolver 的实现,并配置了 4xx, 5xx 视图get
通常的,并不须要扩展上面的内容,一般状况下,下面两种方式能够应对大部分场景
1.捕获异常:
使用 @ControllerAdvice 与 @ExceptionHandler 捕获异常并处理(返回自定义json对象或是页面视图,将替代 ErrorAttributes、ErrorViewResolver)
注意:如 404 等是经过 Servlet (DispatcherServlet.noHandlerFound) 的处理并返回 response ( response.sendError) ,并未到达 Controller 层,因此并不能捕获到。
2.直接提供相应错误显示视图,有两种方式:
静态页面
建立 error 文件夹,页面命名必须是 status code 或 4xx,位置在 Spring boot 静态资源路径下
模板页面
使用模板页面,默认只需将 error 文件夹放入 templates 下便可
但须要注意若是 prefix 与 suffix 配置 (freemarker),则存放目录与文件后缀须要做相应的改变
3.覆盖Spring boot 默认的 error 页面
将命名为 error.ftl (注意匹配 prefix、suffix)的页面放入 templates 下便可
注意:不要放入 error 文件夹下,这点与 4xx 页面不一样
默认全局的 error 页面将显示全部状态下的错误信息,若是放入 4xx 等页面后,将优先匹配 4xx 页面 (根据 status code )