Spring Boot默认、自定义返回的异常信息和Spring Boot的自适应
1.默认返回的异常信息
工程结构:
1.1ErroController控制类
@Controller
public class ErrorController {
@RequestMapping("/index.do")
public String index(Model model){
model.addAttribute("msg","你好,inde页面");
int i=1/0; //它是一个运行期异常,是一个算数异常!!
return "index";
}
}
1.2index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
我是index页面
<h1 th:text="${msg}"></h1>
</body>
</html>
1.3 4xx.html(404、405…)
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>你好!你的页面去火星去了,请重试!</h1>
<h2>获取错误信息:</h2>
timestamp 时间戳:<h3 th:text="${timestamp}"></h3>
status 状态码:<h3 th:text="${status}"></h3>
error 错误提示:<h3 th:text="${error}"></h3>
message 异常消息:<h3 th:text="${message}"></h3>
</body>
</html>
截图:
1.3 5xx.html(500…)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>你好!你的网络航班延误了,请换个网络或请重试!</h1>
<h2>获取错误信息:</h2>
timestamp 时间戳:<h3 th:text="${timestamp}"></h3>
status 状态码:<h3 th:text="${status}"></h3>
error 错误提示:<h3 th:text="${error}"></h3>
message 异常消息:<h3 th:text="${message}"></h3>
</body>
</html>
截图:
2.自定义返回的异常消息
2.1 增强类: ErrorControllerAdvice
@ControllerAdvice
public class ErrorControllerAdvice {
//提供异常处理功能
@ExceptionHandler(ArithmeticException.class)
@ResponseBody
public Map arithmeticException(){
HashMap map=new HashMap();
//定义一些自定义的异常信息
map.put("msg","我们自己给的500错误!!!");
map.put("code","500");
return map;
}
}
2.2 控制类:ErrorController
@Controller
public class ErrorController {
@GetMapping("/index500.do")
public String index500(Model model){
model.addAttribute("msg","你好,index页面");
int i=1/0; //它是一个运行期异常,是一个算数异常!!
return "index";
}
@PostMapping("/index405.do")
public String index405(Model model){
model.addAttribute("msg","你好,index页面");
return "index";
}
}
截图:
3.通过去请求头进行前后端分离(SpringBoot自适应)
通过请求头,用户在客户端(浏览器、安卓、ios)看到的错误页面;而程序员在服务端看到的是错误信息(json数据信息)。
3.1 ErrorController
/**
* 在以后的开发中,有可能是一个后台,同时为多种客户端提供后台服务(浏览器、安卓、IOS、前后端分离的前端)
* 那么在异常处理的时候,这个时候,springboot做了自适应:
* 如果请求后端的是浏览器,springboot可以直接返回一个错误页面给浏览器看
* 如果请求后端的是API,springboot可以直接返回一个错误的json数据给他们看
* 以上自适应效果,springboot是根据请求头,来进行分辨的,这个我们只需要理解就可以了!!
* 我们不需要做任何操作,这些操作都是springboot完成的!!
*
* 那么我们做什么呢?
* 我们只需要告诉springboot错误页面是什么、显示给客户端的数据是什么就可以了!!
* 我们一定是按照springboot提供的规范(接口 )来进行编码。
*
* 接下来,我们要完成异常信息的自适应,浏览器请求返回错误页面,API请求返回错误JSON
*/
@Controller
public class ErrorController {
@GetMapping("/index500.do")
public String index500(Model model){
model.addAttribute("msg","你好,index页面");
int i=1/0; //它是一个运行期异常,是一个算数异常!!
return "index";
}
@PostMapping("/index405.do")
public String index405(Model model){
model.addAttribute("msg","你好,index页面");
return "index";
}
}
3.2 ErrorControllerAdvice
@ControllerAdvice
public class ErrorControllerAdvice {
//提供异常处理功能
@ExceptionHandler(ArithmeticException.class)
public String arithmeticException(HttpServletRequest request){
HashMap map=new HashMap();
//定义一些自定义的异常信息
map.put("msg","我们自己给的500错误!!!");
map.put("code","500");
//我们还需要将这些自定义异常信息告诉springboot
request.setAttribute("errMsg",map);
//转发到error请求,该请求由springboot提供,我们不用写
return "forword:/error";
}
}
3.3 MyErrorAttribute
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;
@Component
public class MyErrorAttribute extends DefaultErrorAttributes {
@Override
public Map<String, Object> getErrorAttributes(WebRequest webRequest, ErrorAttributeOptions options) {
//从父类中获取默认的错误消息
Map<String, Object> errorAttributes = super.getErrorAttributes(webRequest, options);
//把自己的错误消息获取到,也添加进去!!
Object errMsg = webRequest.getAttribute("errMsg",0);
errorAttributes.put("errMgs",errMsg);
return errorAttributes;
}
}
截图:
1.客户端(浏览器):
2.API端: