SpringBoot全局异常处理类的使用方法

本文以SpringBoot的全局异常处理为例,为大家分析全局异常处理类MyExceptionHandler和MyErrorController的使用方法。阅读完整文相信大家对SpringBoot全局异常处理类有了一定的认识。

创新新互联,凭借10年的成都网站制作、网站建设经验,本着真心·诚心服务的企业理念服务于成都中小企业设计网站有千余家案例。做网站建设,选创新互联

1. MyExceptionHandler.java 全局异常处理类

如果多个异常处理类,需要在全局异常处理类(本类)之前执行,请添加:

import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;

// 只要保证比Ordered.LOWEST_PRECEDENCE 小就可以了
@Order(Ordered.LOWEST_PRECEDENCE - 1)

优先执行此类,这里不好抓取404、403等错误信息
getMaps()请参考获取request中传递过来的参数信息
getHeaders()请参考获取request中传递过来的header信息
代码如下:

import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

/**
 * 
描述:全局异常处理类
* 优先执行此异常处理类 *   */ @ControllerAdvice public class MyExceptionHandler {    private final Logger log = LoggerFactory.getLogger(getClass());    @ExceptionHandler(value =Exception.class)    public String exceptionHandler(HttpServletRequest request, Exception e){        Map paramsMap = getMaps(request);        Map headersMap = getHeaders(request);        String requestUri = request.getAttribute("org.springframework.web.servlet.HandlerMapping.lookupPath").toString();        log.error("请求[{}]发生[{}]异常\r\n参数[{}]\r\nheader[{}]", requestUri,e.getMessage(),paramsMap,headersMap, e);        // 返回错误信息,交给其他异常处理类处理        return e.getMessage();    }    // =================== private method ===================    /**     *
功能:获取从request中传递过来的参数信息
    *     * @return Map     */    private Map getMaps(HttpServletRequest request){        Map paramMap = new HashMap();        Enumeration enume = request.getParameterNames();        while (enume.hasMoreElements()) {            String key = (String) enume.nextElement();            String[] values = request.getParameterValues(key);            paramMap.put(key, values.length == 1 ? request.getParameter(key).trim() : values);        }        return paramMap;    }    /**     *
功能: 获取从request中传递过来的header信息
    *     * @return Map     */    private Map getHeaders(HttpServletRequest request) {        Map headerMap = new HashMap();        Enumeration er = request.getHeaderNames();//获取请求头的所有name值        String headerName;        while(er.hasMoreElements()){            headerName = er.nextElement().toString();            headerMap.put(headerName, request.getHeader(headerName));        }        return headerMap;    } }

2. MyErrorController.java 全局请求错误信息处理类

后执行此类,此类可以有效抓取,404、403等信息,代码如下:

import javax.servlet.http.HttpServletRequest;

import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.fastjson.JSONObject;
import com.jnxj.common.vo.MessageBean;

/**
 * 
描述:全局错误信息处理
*  执行完异常处理类之后执行此类 */ @RestController public class MyErrorController implements ErrorController {    @Override    public String getErrorPath() {        return "/error";    }    @RequestMapping("/error")    public String handleError(HttpServletRequest request) {        String message;        // 获取statusCode:401,404,500        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");        if (statusCode == 400) {            message = "语义有误,当前请求无法被服务器理解或请求参数有误";        } else if (statusCode == 401) {            message = "当前请求需要用户验证";        } else if (statusCode == 403) {            message = "权限不足";        } else if (statusCode == 404) {            message = "请求的资源不存在";        } else {            message = "系统不小心生病了,正在紧急修复中,请耐心等候...o(╥﹏╥)o";        }        MessageBean messageBean = new MessageBean();        messageBean.setCode(statusCode.toString());        messageBean.setMessage(message);        return JSONObject.toJSONString(messageBean);    } }

看完这篇文章,你们学会SpringBoot全局异常处理类的使用方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读。


文章名称:SpringBoot全局异常处理类的使用方法
标题URL:http://pwwzsj.com/article/jdschh.html