Spring Boot教程(10) – 错误处理

栏目: Java · 发布时间: 4年前

内容简介:如果你使用页面标题为“Whitelabel Error Page”,直译为“白标错误页”,啥是白标,知乎上我搜到了这个答案:我觉着吧,“白标错误页”的意思就是这个错误页面是个样板,你可以根据自己的需求自定义错误页面样式。

如果你使用 Spring Initializr 新建一个web项目,运行并访问他的话,因为没有写控制器,你会得到一个错误页面,告诉你请求路径没找到(404错误):

Spring Boot教程(10) – 错误处理

页面标题为“Whitelabel Error Page”,直译为“白标错误页”,啥是白标,知乎上我搜到了这个答案:

White Label 意思是你开发了一个产品,而这个产品可以根据其他不同公司的品牌形象(品牌logo,品牌颜色,图片等等)包装成该公司自身的产品。

Gary Ma

我觉着吧,“白标错误页”的意思就是这个错误页面是个样板,你可以根据自己的需求自定义错误页面样式。

错误页面,可以是 静态HTML文件 ,也可以用 模板引擎 生成。

Spring Boot的静态内容,可以放在类路径下的 static 或者 public 或者 resources 或者 META-INF/resources 目录下。我通常选择 static 目录,这时候错误页面需要放在 static/error 目录下,文件后缀为html,文件名为它所代表的HTTP状态码,比如处理404错误的文件路径为 static/error/404.html 。如果你想让错误页面接受更多的状态码,可以写成 4xx.html 或者 5xx.html

Spring Boot教程(10) – 错误处理

如果你使用模板引擎生成错误页面,文件需要放在类路径下 templates/error 目录,文件后缀根据不同的模板引擎而定,文件名依然是HTTP状态码。

Spring Boot教程(10) – 错误处理

如果你对以上两种自定义错误页面的方式不太满意,你可以自己实现一个 ErrorViewResolver 类型的Bean,这个Bean用来处理如何将HTTP状态码和视图对应:

Spring Boot教程(10) – 错误处理

Spring Boot的错误处理机制不仅仅可以展示网页,也可以返回JSON。你尝试在命令行输入命令 curl localhost:8080 可以得到类似下图的错误信息。

Spring Boot教程(10) – 错误处理

同样的错误,在浏览器和在终端(或者其他非浏览器方式)的输出是不一样的。但是他们所包含的信息是一样的。这些信息是由 ErrorAttributes 对象提供的, ErrorAttributes 会根据网络请求的信息,生成一个 Map<String, Object> 对象,上图的JSON就是根据它生成的,“白标错误页”也是根据它生成的。你要是想自定义Map里的东西,那就自己实现 ErrorAttributes ,作为Bean放到容器里。它的默认实现是 DefaultErrorAttributes ,你可以参考参考。

Spring Boot教程(10) – 错误处理
自定义ErrorAttributes

还没完,咱们继续深入。

如果你的控制器方法在处理请求的时候异常了,那么框架会将你的请求转发(forward,不是redirect)到/error路径。有个控制器是专门处理/error路径请求的,叫做 BasicErrorController ,本文到从开头到现在提到的所有东西的逻辑都在它的代码里,建议你读一读。这个/error路径其实也是可以改的,修改 server.error.path 属性就行。错误处理机制其实是由一个自动配置类 ErrorMvcAutoConfiguration 触发生效的, BasicErrorControllerDefaultErrorAttributes 都是在这个配置类里创建的,在这里,你还能找到“白标错误页”的生成代码。

如果Spring Boot默认的错误处理机制(即 BasicErrorController )还不够你用的,那就只能自己写个控制器了。自己写控制器,你返回给客户端什么东西都中。注意你的控制器还得实现 ErrorController 接口,这样才能把 BasicErrorController 给替换掉,如下图。

Spring Boot教程(10) – 错误处理

上面的代码复用了 server.error.path 属性。你通过handleError方法就可以定制响应请求了,不管是返回页面还是JSON还是其他的,都可以搞。

到这里还不能满足你对错误处理的需要?

上面说的都是Spring Boot的错误处理机制,其实Spring MVC还自带了 一些 。在控制器里,可以添加一个方法并加上 @ExceptionHandler 注解,这样不管控制器的哪个请求处理方法出现了异常,都会到这个方法里处理。

Spring Boot教程(10) – 错误处理

图中的参数类型是Exception,可以从它那里获取异常信息。不过它范围有点大,你可以在注解里加个参数,让errorHandler方法接受的异常更具体一点。

Spring Boot教程(10) – 错误处理

你还可以写多个错误处理方法,每个处理不同类型或者场景下的异常。错误处理方法的参数除了上面提到的Exception,还有很多可以用,比如 HttpMethodWebRequestModel 等等,具体列表可以查看 官方文档 。错误处理方法的返回值跟请求处理方法(handler methods)的返回值也都差不多,比如 ModelAndView 、模板文件名字、 ResponseEntity<> 等等。

@ExceptionHandler 结合 @ControllerAdvice 注解可以处理所有控制器的异常。不过我们先到这里,稍后的文章再谈他。


以上所述就是小编给大家介绍的《Spring Boot教程(10) – 错误处理》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

正则表达式必知必会(修订版)

正则表达式必知必会(修订版)

福达 (Ben Forta) / 杨涛 / 人民邮电出版社 / 2015-1-1 / 29.00元

《正则表达式必知必会》从简单的文本匹配开始,循序渐进地介绍了很多复杂内容,其中包括回溯引用、条件性求值和前后查找,等等。每章都为读者准备了许多简明又实用的示例,有助于全面、系统、快速掌握正则表达式,并运用它们去解决实际问题。正则表达式是一种威力无比强大的武器,几乎在所有的程序设计语言里和计算机平台上都可以用它来完成各种复杂的文本处理工作。而且书中的内容在保持语言和平台中立的同时,还兼顾了各种平台之......一起来看看 《正则表达式必知必会(修订版)》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

MD5 加密
MD5 加密

MD5 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具