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

Spring Boot默认、自定义返回的异常信息和Spring Boot的自适应

1.默认返回的异常信息

工程结构:
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




    
    Title


    我是index页面
    

1.3 4xx.html(404、405…)




    
    Title


你好!你的页面去火星去了,请重试!

获取错误信息:

timestamp 时间戳:

status 状态码:

error 错误提示:

message 异常消息:

截图:
Spring Boot的异常处理机制及自适应_第2张图片
1.3 5xx.html(500…)




    
    Title


你好!你的网络航班延误了,请换个网络或请重试!

获取错误信息:

timestamp 时间戳:

status 状态码:

error 错误提示:

message 异常消息:

截图:
Spring Boot的异常处理机制及自适应_第3张图片

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";
    }
}

截图:
Spring Boot的异常处理机制及自适应_第4张图片

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 getErrorAttributes(WebRequest webRequest, ErrorAttributeOptions options) {
        //从父类中获取默认的错误消息
        Map errorAttributes = super.getErrorAttributes(webRequest, options);
        //把自己的错误消息获取到,也添加进去!!
        Object errMsg = webRequest.getAttribute("errMsg",0);
        errorAttributes.put("errMgs",errMsg);

        return errorAttributes;
    }
}

截图:
1.客户端(浏览器):
Spring Boot的异常处理机制及自适应_第5张图片
2.API端:
Spring Boot的异常处理机制及自适应_第6张图片
Spring Boot的异常处理机制及自适应_第7张图片

你可能感兴趣的:(Spring Boot的异常处理机制及自适应)