SpringBoot——异常处理()

自定义异常页面

从 SpringBoot 错误机制源码分析,知道当遇到错误情况时候,

  1. SpringBoot 会首先返回到模版引擎文件夹下的 /error/HTTP 状态码 文件,
  2. 如果不存在,则检查去模版引擎下的 /error/4xx 或者 /error/5xx 文件,
  3. 如果还不存在,则检查静态资源文件夹下对应的上述文件。

并且在返回时会共享一些错误信息,这些错误信息可以在模版引擎中直接使用。

1
2
3
4
5
6
7
8
errorAttributes.put("timestamp", new Date());
errorAttributes.put("status", status);
errorAttributes.put("error", HttpStatus.valueOf(status).getReasonPhrase());
errorAttributes.put("errors", result.getAllErrors());
errorAttributes.put("exception", error.getClass().getName());
errorAttributes.put("message", error.getMessage());
errorAttributes.put("trace", stackTrace.toString());
errorAttributes.put("path", path);

在 templates/error 下自定义 404.html 页面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!doctype html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>[[${status}]]</title>
<!-- Bootstrap core CSS -->
<link href="/webjars/bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet">
</head>
<body >
<div class="m-5" >
<p>错误码:[[${status}]]</p>
<p>信息:[[${message}]]</p>
<p>时间:[[${#dates.format(timestamp,'yyyy-MM-dd hh:mm:ss ')}]]</p>
<p>请求路径:[[${path}]]</p>
</div>

</body>
</html>

随意访问不存在路径得到:

SpringBoot——异常处理(十一)_2020-05-19-13-40-09.png

自定义错误JSON

根据上面的 SpringBoot 错误处理原理分析,得知最终返回的 JSON 信息是从一个 map 对象中转换出来的,那么,只要能自定义 map 中的值,就可以自定义错误信息的 json 格式了。直接重写 DefaultErrorAttributes 类的 getErrorAttributes 方法即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.qn.config;

import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.WebRequest;
import java.util.HashMap;
import java.util.Map;

@Component
public class ErrorAttributesCustom extends DefaultErrorAttributes {

@Override
public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
Map<String, Object> map = super.getErrorAttributes(webRequest, includeStackTrace);
String code = map.get("status").toString();
String message = map.get("templates/error").toString();
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("code", code);
hashMap.put("message", message);
return hashMap;
}
}

SpringBoot——异常处理(十一)_2020-05-19-14-03-00.png

全局异常处理

使用 @ControllerAdvice 结合 @ExceptionHandler 注解可以实现统一的异常处理,@ExceptionHandler 注解的类会自动应用在每一个被 @RequestMapping 注解的方法。当程序中出现异常时会层层上抛

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.qn.handler;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
public class ExceptionHandle {
@ResponseBody
@ExceptionHandler(Exception.class)
public String handleException(Exception e) {
return e.getMessage();
}
}
文章目录
  1. 1. 自定义异常页面
  2. 2. 自定义错误JSON
  3. 3. 全局异常处理
|