您好,登錄后才能下訂單哦!
本文以SpringBoot的全局異常處理為例,為大家分析全局異常處理類MyExceptionHandler和MyErrorController的使用方法。閱讀完整文相信大家對SpringBoot全局異常處理類有了一定的認識。
如果多個異常處理類,需要在全局異常處理類(本類)之前執行,請添加:
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;
/**
* <h6>描述:全局異常處理類</h6>
* 優先執行此異常處理類
*
*/
@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("請求[{}]發生[{}]異常\r\n參數[{}]\r\nheader[{}]", requestUri,e.getMessage(),paramsMap,headersMap, e);
// 返回錯誤信息,交給其他異常處理類處理
return e.getMessage();
}
// =================== private method ===================
/**
* <h6>功能:獲取從request中傳遞過來的參數信息</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中傳遞過來的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();//獲取請求頭的所有name值
String headerName;
while(er.hasMoreElements()){
headerName = er.nextElement().toString();
headerMap.put(headerName, request.getHeader(headerName));
}
return headerMap;
}
}
后執行此類,此類可以有效抓取,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>描述:全局錯誤信息處理</h6>
* 執行完異常處理類之后執行此類
*/
@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全局異常處理類的使用方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。