Spring Boot的异常处理机制及自适应

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端:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值