首先我们先在控制器中写一个异常,默认情况下我们的SpringBoot异常页面是这个样子的。
示例代码如下:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author qinxun
* @date 2023-06-15
* @Descripion: 测试
*/
@RestController
public class IndexController {
@GetMapping("/index")
public String toIndex() {
// 500状态码
int i = 1 / 0;
return "index";
}
}
一、自定义静态异常页面
自定义静态异常页面,我们可以分成两种方式,第一种就是使用HTTP状态码来命名页面,例如404.html,403.html,500html等。另一种就是直接定义一个4xx.html,表示400-499状态码的页面,5xx.html表示状态码500-599的异常页面。
我们在classpath:/static/error/路径下定义相关异常页面
4xx.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>Http状态码400-499的异常页面</div>
</body>
</html>
5xx.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>Http状态码500-599的异常页面</div>
</body>
</html>
启动项目,如果项目抛出HTTP状态码500的错误,就会自动显示5xx.html这个页面,反之抛出状态码400的错误,就会显示4xx.html这个页面。
二、自定义动态异常页面
4xx.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>4xx</h1>
<table border="1">
<tr>
<td>path</td>
<td>error</td>
<td>message</td>
<td>status</td>
</tr>
<tr>
<td th:text="${path}"></td>
<td th:text="${error}"></td>
<td th:text="${message}"></td>
<td th:text="${status}"></td>
</tr>
</table>
</body>
</html>
5xx.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>5xx</h1>
<table border="1">
<tr>
<td>path</td>
<td>error</td>
<td>message</td>
<td>status</td>
</tr>
<tr>
<td th:text="${path}"></td>
<td th:text="${error}"></td>
<td th:text="${message}"></td>
<td th:text="${status}"></td>
</tr>
</table>
</body>
</html>
如果动态异常页面和静态异常页面同时存在,默认使用动态页面,完整的错误页面查找方式应该是:
发生500错误->查找动态500.html页面->查找静态500.html页面->查找动态5xx.html页面->查找静态5xx.html页面
页面上使用的path、error、message、status默认为SpringBoot的异常机制返回的。
我们重新访问接口:
我们可以创建一个自定义类实现异常数据返回处理。
示例代码如下:
import org.springframework.boot.web.error.ErrorAttributeOptions;
import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.WebRequest;
import java.util.Map;
/**
* @author qinxun
* @date 2023-06-16
* @Descripion: 自定义异常数据返回
*/
@Component
public class MyErrorAttributes extends DefaultErrorAttributes {
@Override
public Map<String, Object> getErrorAttributes(WebRequest webRequest, ErrorAttributeOptions options) {
Map<String, Object> map = super.getErrorAttributes(webRequest, options);
if ((Integer) map.get("status") == 500) {
map.put("message", "服务器内部错误!");
}
return map;
}
}
启动项目,我们重新访问接口:
异常页面显示了我们自定义的异常数据。