SpringMVC設(shè)置全局異常處理器的步驟
背景
在項(xiàng)目中我們有需求做一個(gè)全局異常處理,來(lái)規(guī)范所有出去的異常信息。
參考:官方文檔
分析
首先 ControllerAdvice(RestControllerAdvice ) ,ControllerAdvice 是無(wú)法處理過(guò)濾器和攔截器中的異常的。
引用一張圖
下面介紹controller層的全局異常設(shè)置
全局異常處理也有多種方式
使用@ControllerAdvice(@RestControllerAdvice)+@ExceptionHandler實(shí)現(xiàn)全局異常
import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; @Slf4j @ControllerAdvice public class GlobalExceptionHandler { /** * 處理參數(shù)錯(cuò)誤的異常 * @param e * @return */ @ResponseBody @ExceptionHandler(value = IllegalParamsException.class) public ResultVO<Object> handleIllegalParamsException(IllegalParamsException e) { ResultVO<Object> resultVo = new ResultVO<>(); resultVo.setStatus(HttpStatus.BAD_REQUEST.value()); resultVo.setErrorCode(e.getErrorInfo().getErrorCode()); resultVo.setErrorMsg(e.getErrorInfo().getErrorDesc()); return resultVo; } @ResponseBody @ExceptionHandler(value = Exception.class) public ResultVO<Object> handleException(Exception e) { ResultVO<Object> resultVo = new ResultVO<>(); resultVo.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); resultVo.setErrorMsg(e.getMessage()); return resultVo; } }
@Data @AllArgsConstructor @NoArgsConstructor public class ResultVO<T> { private Integer status; private String errorCode; private String errorMsg; private T data; public ResultVO(Integer status, String errorCode, String errorMsg) { this.status = status; this.errorCode = errorCode; this.errorMsg = errorMsg; } }
public class IllegalParamsException extends RuntimeException { private static final long serialVersionUID = -6298406656682893468L; private OperationErrorEnum errorInfo; public IllegalParamsException(OperationErrorEnum errorInfo) { this.errorInfo = errorInfo; } public IllegalParamsException(String message, OperationErrorEnum errorInfo) { super(message); this.errorInfo = errorInfo; } public IllegalParamsException(String message, Throwable cause, OperationErrorEnum errorInfo) { super(message, cause); this.errorInfo = errorInfo; } public IllegalParamsException(Throwable cause, OperationErrorEnum errorInfo) { super(cause); this.errorInfo = errorInfo; } public IllegalParamsException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, OperationErrorEnum errorInfo) { super(message, cause, enableSuppression, writableStackTrace); this.errorInfo = errorInfo; } public OperationErrorEnum getErrorInfo() { return errorInfo; } }
全局異常處理-多個(gè)處理器匹配順序
參考:參考
多個(gè)處理器的兩種情況:
存在一個(gè)類(lèi)中
子類(lèi)異常處理器優(yōu)先
存在不同的類(lèi)中
與多個(gè)異常處理類(lèi)放入LinkedHashMap的順序有關(guān),
可以利用Order指定順序,如果沒(méi)有,則默認(rèn)最小順序;
那么,如果都沒(méi)有指定順序的話,那就是list中的順序
對(duì)于過(guò)濾器和攔截器中的異常,有兩種思路可以考慮
1、catch后通過(guò)轉(zhuǎn)發(fā)到異常頁(yè)面(設(shè)置ModelAndView)
參考:參考
2、攔截器中發(fā)生異常,攔截器中直接返回錯(cuò)誤(通過(guò)response.getOutputStream().write() 直接寫(xiě)錯(cuò)誤信息)
如:
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { try { // 業(yè)務(wù)代碼 } catch (Exception e) { response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE); ResultVO<Object> resultVo = new ResultVO<>(); resultVo.setStatus(HttpStatus.UNAUTHORIZED.value()); resultVo.setErrorMsg(ACCESS_PARAM_ERROR.getErrorDesc()); response.getOutputStream().write(new String(JSON.toJSONString(resultVo)).getBytes(StandardCharsets.UTF_8)); logger.error("==== WhiteListAndAuthenticationInterceptor攔截器攔截到了方法:{} 解析鑒權(quán)參數(shù)異常 ====", methodName); return false; } }
到此這篇關(guān)于SpringMVC設(shè)置全局異常處理器的步驟的文章就介紹到這了,更多相關(guān)SpringMVC全局異常處理器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java計(jì)時(shí)器StopWatch實(shí)現(xiàn)方法代碼實(shí)例
這篇文章主要介紹了Java計(jì)時(shí)器StopWatch實(shí)現(xiàn)方法代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07Spring Security OAuth過(guò)期的解決方法
這篇文章主要介紹了Spring Security OAuth過(guò)期的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Java基礎(chǔ)之選擇結(jié)構(gòu)與循環(huán)結(jié)構(gòu)
這篇文章主要介紹了Java基礎(chǔ)之選擇結(jié)構(gòu)與循環(huán)結(jié)構(gòu),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04Java8接口中引入default關(guān)鍵字的本質(zhì)原因詳析
Default方法是在java8中引入的關(guān)鍵字,也可稱為Virtual extension methods—虛擬擴(kuò)展方法,這篇文章主要給大家介紹了關(guān)于Java8接口中引入default關(guān)鍵字的本質(zhì)原因,需要的朋友可以參考下2022-01-01JDBC 程序的常見(jiàn)錯(cuò)誤及調(diào)試方法
本文是《Java Web開(kāi)發(fā)教程——入門(mén)與提高篇(JSP+Servlet)》一書(shū)《第9章 JDBC技術(shù)》的補(bǔ)充內(nèi)容。2009-06-06java程序代碼與文本對(duì)比實(shí)用工具簡(jiǎn)介
可以對(duì)兩段文本進(jìn)行對(duì)比,檢測(cè)/比較兩個(gè)文本有什么不同的差異,以便修改,常用于程序代碼,就是不需要人工查看,尤其是大文件,有幾百上千行的代碼,這時(shí)候就建議使用比較工具了,不用浪費(fèi)過(guò)多時(shí)間去尋找2021-09-09Java解壓縮zip - 解壓縮多個(gè)文件或文件夾實(shí)例
本篇文章主要介紹了Java解壓縮zip - 解壓縮多個(gè)文件或文件夾實(shí)例,非常具有實(shí)用價(jià)值,有需要的可以了解一下。2016-12-12