为什么会有这篇博客
故事的开始是这个样子的。在一个慵懒的午后,闲的蛋疼的一天里我在测试着接口,然后我就看到了如下画面 ,它们是这样的还有这样的:
很显然这是当应用发生错误时候的提示。很不巧的是公司的项目最近好像经常出现各种奇怪的错误异常信息,但是开发人员却由于不能快速的定位问题而一脸懵逼的样子。于是乎我决定是时候把这个异常处理好好给搞一下了(整点自定义啥的让信息更详细)。 在搞了一段时间后,终于这篇博客是时候诞生了(老妹儿 法克儿 ***** )。
Spring Boot 如何处理异常信息?
如果有人说通过 @ExceptionHandler 来进行处理那也没错 ,不过我在这里要说的是另外一种方式那就是当发生异常后,将这个 Request forward 到一个错误处理的接口上去 , 默认是 /error . Spring Boot 提供了一个默认的 BasicErrorController 来处理这个 /error 接口的请求 。一个方法处理响应 json 格式数据, 另一个函数响应一个 html 页面,也就是我们前面看到的那个不能再糊弄事的 Whitelabel Error Page 。
那么看到这个代码我就又产生了一个疑问,这个名字叫做 error 的试图是定义在哪里呢 ? 刚开始的时候我以为是 spring boot 包内部的一个 jsp 或者 html 页面什么的,然后我就开始搜索 ...... 最后没找到。经过 debug 查看源码后我发现了这个东西 :ErrorMvcAutoConfiguration , 里面有一个 WhitelabelErrorViewConfiguration 里面还有一个 SpelView 。就是它了,名称叫 error 的视图,显然这个我们是可以覆盖的只要我们自己再声明一个 bean 名称为 error 就行了。
当然看到这里我大致知道了 spring boot 是如何通过 /error 接口来处理异常的。但是还是觉得心理空落落的 ,感觉还是少了点什么。对了我之前说过了有异常后就会把当前 Request forward 到 /error 这个接口上 , 对了我现在想知道就是在什么地方进行 forward 的 。
How to forward a request to the /error interface
老实说这个问题的答案我还是找了一会的。 最后我发现不是在 Spring 中做的这个 forward 操作。必须提前声明下我的项目用的是内嵌的 tomcat ,至于其他类型的容器这篇博客可能并不适用。 forward 到 /error 的操作是在 tomcat 的 org.apache.catalina.core.StandardHostValve 中进行的。