當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
在Spring Boot中使用切面统一处理自定义的异常
生活随笔
收集整理的這篇文章主要介紹了
在Spring Boot中使用切面统一处理自定义的异常
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
最近我們將項目的一個單獨模塊提取了一個微服務,這個微服務主要負責其他系統(tǒng)的接入。目的是發(fā)布主項目的時候不會影響到其他系統(tǒng)接入。在提取出的微服務中,需要定義一個正常返回的報文和異常返回的報文。正常返回報文就是正常業(yè)務返回的數(shù)據(jù)報文,異常返回報文我這里定義為比如一些校驗異常或是權限異常等等,這里不包括程序出現(xiàn)的異常,比如數(shù)據(jù)庫出錯這些。我暫時是這樣定義的。大家有好的方式也可以一塊討論。
正常的報文:正常的報文比較松散,我指定為自己去定義報文格式。不過基本有這兩個字段
{"requestId": "ed93f3cb-f35e-473f-b9f3-0d451b8b79c6","data": {...} }requestId是為了更容易跟蹤程序錯誤
異常的報文:
{"requestId": "ed93f3cb-f35e-473f-b9f3-0d451b8b79c6","error": {"code": "NotNullAndLengthErr.waybillNo","msg": "運單號不為空且長度需為15位或12位"} }在程序中主要處理異常的報文,多為對權限的校驗,業(yè)務的校驗,我將這些校驗出錯的情況用異常的方式拋出,然后在切面中統(tǒng)一處理自定義的異常
public class OccpDdsRuntimeException extends RuntimeException {private ErrorCodeEnum errorCodeEnum;public ErrorCodeEnum getErrorCodeEnum() {return errorCodeEnum;}public OccpDdsRuntimeException(ErrorCodeEnum errorCodeEnum) {super(errorCodeEnum.getErrMsg());this.errorCodeEnum = errorCodeEnum;} }這里的ErrorCodeEnum是我自定義的Enum類,為的是定義一些錯誤,比如校驗錯誤,權限錯誤等
public enum ErrorCodeEnum {NotNullAndLengthErrWaybillNo("NotNullAndLengthErr.waybillNo","運單號不為空且長度需為15位或12位", 420);private String errCode;private String errMsg;private int httpStatus;ErrorCodeEnum(String errCode, String errMsg, int httpStatus) {this.errCode = errCode;this.errMsg = errMsg;this.httpStatus = httpStatus;}public String getErrCode() {return errCode;}public String getErrMsg() {return errMsg;}public int getHttpStatus() {return httpStatus;} }下面看一下真正的絕學,在切面中統(tǒng)一處理自定義的異常以達到返回異常的報文
/*** 全局異常處理*/ @ControllerAdvice public class OccpDdsExceptionHandler {private static Logger LOG = LoggerFactory.getLogger(OccpDdsExceptionHandler.class);@ExceptionHandler(OccpDdsRuntimeException.class) //1@ResponseBody //2public Map<String, Object> handleException(OccpDdsRuntimeException ex, HttpServletResponse response) {Map<String, Object> responseBody = new HashMap<>();String requestId = getRequestId();if (ex instanceof OccpDdsRuntimeException) {//這里進行組裝報文的操作}//返回報文return responseBody;}private String getRequestId() {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();return (String)request.getAttribute(REQUEST_ID);}}上面的代碼中注釋第一行完全可以自己去組裝想要的報文,1處定義了捕獲哪個異常,2表示返回的對象類型。
這樣就可以測試一下項目當拋出自定義異常了
總結
以上是生活随笔為你收集整理的在Spring Boot中使用切面统一处理自定义的异常的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度发布2023年十一假期出行预测报告
- 下一篇: JSON转换工具---jackson