若是你使用Spring Initializr新建一个web项目,运行并访问他的话,由于没有写控制器,你会获得一个错误页面,告诉你请求路径没找到(404错误):html
页面标题为“Whitelabel Error Page”,直译为“白标错误页”,啥是白标,知乎上我搜到了这个答案:web
White Label 意思是你开发了一个产品,而这个产品能够根据其余不一样公司的品牌形象(品牌logo,品牌颜色,图片等等)包装成该公司自身的产品。spring
我觉着吧,“白标错误页”的意思就是这个错误页面是个样板,你能够根据本身的需求自定义错误页面样式。浏览器
错误页面,能够是静态HTML文件,也能够用模板引擎生成。网络
Spring Boot的静态内容,能够放在类路径下的static
或者public
或者resources
或者 META-INF/resources
目录下。我一般选择static
目录,这时候错误页面须要放在static/error
目录下,文件后缀为html,文件名为它所表明的HTTP状态码,好比处理404错误的文件路径为static/error/404.html
。若是你想让错误页面接受更多的状态码,能够写成4xx.html
或者5xx.html
。mvc
若是你使用模板引擎生成错误页面,文件须要放在类路径下templates/error
目录,文件后缀根据不一样的模板引擎而定,文件名依然是HTTP状态码。app
若是你对以上两种自定义错误页面的方式不太满意,你能够本身实现一个ErrorViewResolver
类型的Bean,这个Bean用来处理如何将HTTP状态码和视图对应:框架
Spring Boot的错误处理机制不只仅能够展现网页,也能够返回JSON。你尝试在命令行输入命令curl localhost:8080
能够获得相似下图的错误信息。curl
一样的错误,在浏览器和在终端(或者其余非浏览器方式)的输出是不同的。可是他们所包含的信息是同样的。这些信息是由ErrorAttributes
对象提供的,ErrorAttributes
会根据网络请求的信息,生成一个Map<String, Object>
对象,上图的JSON就是根据它生成的,“白标错误页”也是根据它生成的。你要是想自定义Map里的东西,那就本身实现ErrorAttributes
,做为Bean放到容器里。它的默认实现是DefaultErrorAttributes
,你能够参考参考。spring-boot
还没完,我们继续深刻。
若是你的控制器方法在处理请求的时候异常了,那么框架会将你的请求转发(forward,不是redirect)到/error路径。有个控制器是专门处理/error路径请求的,叫作BasicErrorController
,本文到从开头到如今提到的全部东西的逻辑都在它的代码里,建议你读一读。这个/error路径其实也是能够改的,修改server.error.path
属性就行。错误处理机制实际上是由一个自动配置类ErrorMvcAutoConfiguration
触发生效的,BasicErrorController
和DefaultErrorAttributes
都是在这个配置类里建立的,在这里,你还能找到“白标错误页”的生成代码。
若是Spring Boot默认的错误处理机制(即BasicErrorController
)还不够你用的,那就只能本身写个控制器了。本身写控制器,你返回给客户端什么东西都中。注意你的控制器还得实现ErrorController
接口,这样才能把BasicErrorController
给替换掉,以下图。
上面的代码复用了server.error.path
属性。你经过handleError方法就能够定制响应请求了,不论是返回页面仍是JSON仍是其余的,均可以搞。
到这里还不能知足你对错误处理的须要?
上面说的都是Spring Boot的错误处理机制,其实Spring MVC还自带了一些。在控制器里,能够添加一个方法并加上@ExceptionHandler
注解,这样无论控制器的哪一个请求处理方法出现了异常,都会到这个方法里处理。
图中的参数类型是Exception,能够从它那里获取异常信息。不过它范围有点大,你能够在注解里加个参数,让errorHandler方法接受的异常更具体一点。
你还能够写多个错误处理方法,每一个处理不一样类型或者场景下的异常。错误处理方法的参数除了上面提到的Exception,还有不少能够用,好比HttpMethod
、WebRequest
、Model
等等,具体列表能够查看官方文档。错误处理方法的返回值跟请求处理方法(handler methods)的返回值也都差很少,好比ModelAndView
、模板文件名字、ResponseEntity<>
等等。
@ExceptionHandler
结合@ControllerAdvice
注解能够处理全部控制器的异常。不过咱们先到这里,稍后的文章再谈他。