溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

SpringBoot全局異常處理類(lèi)的使用方法

發(fā)布時(shí)間:2020-06-06 21:48:50 來(lái)源:億速云 閱讀:299 作者:Leah 欄目:編程語(yǔ)言

本文以SpringBoot的全局異常處理為例,為大家分析全局異常處理類(lèi)MyExceptionHandler和MyErrorController的使用方法。閱讀完整文相信大家對(duì)SpringBoot全局異常處理類(lèi)有了一定的認(rèn)識(shí)。

1. MyExceptionHandler.java 全局異常處理類(lèi)

如果多個(gè)異常處理類(lèi),需要在全局異常處理類(lèi)(本類(lèi))之前執(zhí)行,請(qǐng)?zhí)砑?

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

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

優(yōu)先執(zhí)行此類(lèi),這里不好抓取404、403等錯(cuò)誤信息
getMaps()請(qǐng)參考獲取request中傳遞過(guò)來(lái)的參數(shù)信息
getHeaders()請(qǐng)參考獲取request中傳遞過(guò)來(lái)的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;

/**
 * <h6>描述:全局異常處理類(lèi)</h6>
 * 優(yōu)先執(zhí)行此異常處理類(lèi)
 *  
 */
@ControllerAdvice
public class MyExceptionHandler {
    private final Logger log = LoggerFactory.getLogger(getClass());

    @ExceptionHandler(value =Exception.class)
    public String exceptionHandler(HttpServletRequest request, Exception e){
        Map<String, Object> paramsMap = getMaps(request);
        Map<String, Object> headersMap = getHeaders(request);

        String requestUri = request.getAttribute("org.springframework.web.servlet.HandlerMapping.lookupPath").toString();
        log.error("請(qǐng)求[{}]發(fā)生[{}]異常\r\n參數(shù)[{}]\r\nheader[{}]", requestUri,e.getMessage(),paramsMap,headersMap, e);

        // 返回錯(cuò)誤信息,交給其他異常處理類(lèi)處理
        return e.getMessage();
    }

    // =================== private method ===================

    /**
     * <h6>功能:獲取從request中傳遞過(guò)來(lái)的參數(shù)信息</h6>
     * 
     * @return Map<String, Object>
     */
    private Map<String, Object> getMaps(HttpServletRequest request){
        Map<String, Object> paramMap = new HashMap<String, Object>();
        Enumeration<String> 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;
    }

    /**
     * <h6>功能: 獲取從request中傳遞過(guò)來(lái)的header信息</h6>
     * 
     * @return Map<String, Object>
     */
    private Map<String, Object> getHeaders(HttpServletRequest request) {
        Map<String, Object> headerMap = new HashMap<String, Object>();
        Enumeration<?> er = request.getHeaderNames();//獲取請(qǐng)求頭的所有name值
        String headerName;
        while(er.hasMoreElements()){
            headerName = er.nextElement().toString();
            headerMap.put(headerName, request.getHeader(headerName));
        }

        return headerMap;
    }
}

2. MyErrorController.java 全局請(qǐng)求錯(cuò)誤信息處理類(lèi)

后執(zhí)行此類(lèi),此類(lèi)可以有效抓取,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;

/**
 * <h6>描述:全局錯(cuò)誤信息處理</h6>
 *  執(zhí)行完異常處理類(lèi)之后執(zhí)行此類(lèi)
 */
@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 = "語(yǔ)義有誤,當(dāng)前請(qǐng)求無(wú)法被服務(wù)器理解或請(qǐng)求參數(shù)有誤";
        } else if (statusCode == 401) {
            message = "當(dāng)前請(qǐng)求需要用戶(hù)驗(yàn)證";
        } else if (statusCode == 403) {
            message = "權(quán)限不足";
        } else if (statusCode == 404) {
            message = "請(qǐng)求的資源不存在";
        } else {
            message = "系統(tǒng)不小心生病了,正在緊急修復(fù)中,請(qǐng)耐心等候...o(╥﹏╥)o";
        }

        MessageBean messageBean = new MessageBean();
        messageBean.setCode(statusCode.toString());
        messageBean.setMessage(message);
        return JSONObject.toJSONString(messageBean);
    }
}

看完這篇文章,你們學(xué)會(huì)SpringBoot全局異常處理類(lèi)的使用方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI