javascript
在Spring Boot中使用切面统一处理自定义的异常
最近我們將項(xiàng)目的一個(gè)單獨(dú)模塊提取了一個(gè)微服務(wù),這個(gè)微服務(wù)主要負(fù)責(zé)其他系統(tǒng)的接入。目的是發(fā)布主項(xiàng)目的時(shí)候不會影響到其他系統(tǒng)接入。在提取出的微服務(wù)中,需要定義一個(gè)正常返回的報(bào)文和異常返回的報(bào)文。正常返回報(bào)文就是正常業(yè)務(wù)返回的數(shù)據(jù)報(bào)文,異常返回報(bào)文我這里定義為比如一些校驗(yàn)異常或是權(quán)限異常等等,這里不包括程序出現(xiàn)的異常,比如數(shù)據(jù)庫出錯(cuò)這些。我暫時(shí)是這樣定義的。大家有好的方式也可以一塊討論。
正常的報(bào)文:正常的報(bào)文比較松散,我指定為自己去定義報(bào)文格式。不過基本有這兩個(gè)字段
{"requestId": "ed93f3cb-f35e-473f-b9f3-0d451b8b79c6","data": {...} }requestId是為了更容易跟蹤程序錯(cuò)誤
異常的報(bào)文:
{"requestId": "ed93f3cb-f35e-473f-b9f3-0d451b8b79c6","error": {"code": "NotNullAndLengthErr.waybillNo","msg": "運(yùn)單號不為空且長度需為15位或12位"} }在程序中主要處理異常的報(bào)文,多為對權(quán)限的校驗(yàn),業(yè)務(wù)的校驗(yàn),我將這些校驗(yàn)出錯(cuò)的情況用異常的方式拋出,然后在切面中統(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類,為的是定義一些錯(cuò)誤,比如校驗(yàn)錯(cuò)誤,權(quán)限錯(cuò)誤等
public enum ErrorCodeEnum {NotNullAndLengthErrWaybillNo("NotNullAndLengthErr.waybillNo","運(yùn)單號不為空且長度需為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;} }下面看一下真正的絕學(xué),在切面中統(tǒng)一處理自定義的異常以達(dá)到返回異常的報(bào)文
/*** 全局異常處理*/ @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) {//這里進(jìn)行組裝報(bào)文的操作}//返回報(bào)文return responseBody;}private String getRequestId() {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();return (String)request.getAttribute(REQUEST_ID);}}上面的代碼中注釋第一行完全可以自己去組裝想要的報(bào)文,1處定義了捕獲哪個(gè)異常,2表示返回的對象類型。
這樣就可以測試一下項(xiàng)目當(dāng)拋出自定義異常了
總結(jié)
以上是生活随笔為你收集整理的在Spring Boot中使用切面统一处理自定义的异常的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度发布2023年十一假期出行预测报告
- 下一篇: gradle idea java ssm