一、前言
在 SpringBoot 项目中,对于异常的统一处理,可以采用 Spring 中@ControllerAdvice
注解标注的类来统一进行处理,也可以自定义异常处理的解决方案。在 SpringBoot 中,对异常的处理存在一些默认的策略,下面我们就分别来看一下。
默认情况下,SpringBoot项目异常页面如下:
其实通过这个默认的提示页面,能够看出来,之所以能够看到这个默认的异常提示页面,是因为开发者没有提供明确映射路径/error
,如果开发者提供了这个路径,则此页面则不会显示,不过在 SpringBoot 项目中提供/error
路径实属下下策,为什么这么说?因为 SpringBoot 本身在处理异常时,即当所有条件都不满足时,才会去寻找/error
路径,为何要这么复杂,这不是降低效率吗?
现在,先来看看在 SpringBoot 中如何自定义异常页面,就页面属性而言,可以分为两类,一类是静态异常页面,另一类是动态异常页面。
二、静态异常页面
常见的异常可以分为两个派系,分别是 400 系列和 500 系列。自定义异常页面也可以分为两类,一类是以 HTTP 响应码来命名的,例如:402.html、404.html、500.html 等等,另一类则是直接定义一个 4xx.html,状态响应码在 400-499 范围内都显示 4xx.html 异常页面,5xx.html 包含 500-599 范围内的状态响应码都显示 5xx.html 异常页面。
默认情况下,是在classpath:/static/error/
下定义异常页面,如下:
【划重点啦】
如果项目中抛出状态码为 500 的错误,则自动展示 500.html 异常页面,若抛出的状态码为 404,则自动展示 404.html 异常页面。如果项目中存在 500.html 页面,同时也存在 5xx.html 页面,若此时发生 500 错误,则优先展示 500.html 页面。这里有个优先级原则:精确 > 模糊。
三、动态异常页面
其实动态异常页面定义与静态异常页面的方式相同,可以采用的模板技术包含:jsp、freemarker、thymeleaf。动态异常页面命名可以是404、500等等精确的状态码命名方式,一般情况下,由于动态异常页面可以直接展示异常详细的信息,所以没有必要挨个枚举了,这里就直接定义为4xx.html、5xx.html。(这里采用的是thymeleaf)
动态异常页面定义如下:
【5xx.html】
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>templates-5xx</h1>
<tr>
<td>path</td>
<td th:text="${path}"></td>
</tr>
<tr>
<td>timestamp</td>
<td th:text="${timestamp}"></td>
</tr>
<tr>
<td>message