摘要:前言一般我們后臺(tái)出錯(cuò)報(bào)都是直接拋出來的,但是微信公眾號(hào),或者支付寶支付等等,他們的異常都有錯(cuò)誤碼對(duì)應(yīng)錯(cuò)誤信息,他們是如何根據(jù)錯(cuò)誤信息展示對(duì)應(yīng)的錯(cuò)誤碼提供給前端的呢,這也就是我們要說的統(tǒng)一錯(cuò)誤消息處理機(jī)制。
1、前言
一般我們后臺(tái)出錯(cuò)報(bào)Exception都是直接拋出來的,但是微信公眾號(hào),或者支付寶支付等等,他們的異常都有錯(cuò)誤碼對(duì)應(yīng)錯(cuò)誤信息,他們是如何根據(jù)錯(cuò)誤信息展示對(duì)應(yīng)的錯(cuò)誤碼提供給前端的呢,這也就是我們要說的統(tǒng)一錯(cuò)誤消息處理機(jī)制。
2、Java實(shí)現(xiàn)首先創(chuàng)建一個(gè)Result類,這個(gè)類作用是設(shè)置消息碼以及消息文本還有消息數(shù)據(jù),如下所示
package com.xfind.util.result; public class Result{ private int code; private String message; private T data; public Result(){ } public Result(int code, String message, T data) { this(code, message); this.data = data; } public Result(int code, String message) { this.code = code; this.message = message; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Object getData() { return data; } public void setData(T data) { this.data = data; } }
設(shè)置之后 ,我們接下來再創(chuàng)建一個(gè)ResultCode類,這個(gè)類的作用是具體的消息碼和消息,如下所示:
package com.xfind.util.result; /** * 異常處理狀態(tài)碼 */ public enum ResultCode { SUCCESS(0, "請(qǐng)求成功"), Unknown_Exception(-1, "未知異常"), USER_NOT_FOUND(10001, "沒有找到此用戶"), USERNAME_NOT_BLANK(10002, "用戶名不能為空"), USERNAME_EXIST(10003, "用戶名已經(jīng)存在"), USERTYPE_ERROR(100031, "用戶類型不正確"), PHONE_WROND(10004, "手機(jī)號(hào)不正確"), SMS_CODE_ERROR(10007, "手機(jī)驗(yàn)證碼不正確"), PHONE_EXIST(10008, "手機(jī)號(hào)已經(jīng)存在"), USER_EMPTY_EXCEPTION(10009, "用戶名、手機(jī)號(hào)或者郵箱為空"), USER_TOKEN_EXCEPTION(10010, "從TOKEN中未查到相關(guān)用戶信息"), USERNAME_PASSWORD_EXCEPTION(10011, "用戶名或者密碼錯(cuò)誤"), EMAIL_SERVER_ECCEPTION(10012, "阿里云郵件服務(wù)端出錯(cuò)"), EMAIL_CLIENT_ECCEPTION(10013, "阿里云郵件客戶端出錯(cuò)"), EMAIL_SEND_ECCEPTION(10014, "阿里云郵件發(fā)送出錯(cuò)"), EMAIL_WROND(10015, "郵箱不正確"), EMAIL_CODE_WROND(10016, "郵箱驗(yàn)證碼不正確"), EMAIL_EXIST(10017, "郵箱已經(jīng)存在"), LOGIN_METHOD_WROND(10018, "登錄方式不正確"), CODE_EMPTY(10019, "驗(yàn)證碼不為空"), PASSWORD_EMPTY(10020, "密碼不為空"), TOKEN_EXCEPTION(10021, "TOKEN認(rèn)證出錯(cuò)"), USER_AUTH_FAILD(10022, "用戶認(rèn)證失敗"), USER_ACCESS_DENIED(10023, "用戶無權(quán)限登錄"), CODE_SEND_FAILD(10030, "驗(yàn)證碼發(fā)送失敗"), ACTION_MONGODB_ERROR(10100, "操作MONGODB數(shù)據(jù)庫出錯(cuò)"), OPERATION_TOO_FREQUENT(10101, "請(qǐng)求過于頻繁,請(qǐng)稍候再試"), GOLD_COINS_INSUFFICIENT(10025,"金幣余額不足"), CODE_EXIST(10023,"編號(hào)已存在"), TESTCODE_EXIST(10033,"答題碼已存在"), TESTCODE_NOEXIST(10034,"答題碼不存在"), TESTCODE_ERROR(10036,"提交數(shù)已達(dá)上限"), TESTCENTER_NOEXIST(10035,"測試題不存在"), NAME_EXIST(10024,"名稱已存在"), NOT_EXIST_EMAIL(10025,"該企業(yè)用戶沒有分配郵箱"), MAIL_REACH_MAX(10026,"達(dá)到收取郵箱上限"), MAIL_NEW_NOTEXIST(10027,"郵箱中沒有可導(dǎo)入的簡歷"), PWD_CONFIRM_ERROR(10029,"兩次密碼不一致"), PWD_ERROR(10030,"密碼不正確"), ENTER_OR_TALENT_NOT_EXITS(10028,"企業(yè)或人才庫簡歷不存在"), PHONE_EMPTY(10031, "手機(jī)號(hào)不能為空"), EMAIL_EMPTY(10032, "郵箱不能為空"), NO_USABLE_MAIL(10040,"沒有可用郵箱"), REQUESTRECORD_EXIST(10050,"簡歷已投遞"), TALENTRESERVER_EXIST(10051,"簡歷已存在于人才儲(chǔ)備庫中,請(qǐng)勿重復(fù)添加"), DEVICE_ID_EMPTY(10052,"設(shè)備ID:deviceId不能為空"), DELETE_CONNECT_ERROR(10053,"刪除connect出錯(cuò)"); private int code; private String message; ResultCode(int code, String message) { this.code = code; this.message = message; } public int getCode() { return code; } public String getMessage() { return message; } }
好了,有了Result和ResultCode類,我們就可以來編寫異常并返回給前端了,不過在這之前我們還要?jiǎng)?chuàng)建兩個(gè)類:DomainException和SuccessResult,
package com.xfind.exception; import com.xfind.util.result.ResultCode; public class DomainException extends RuntimeException { private int errCode = ResultCode.Unknown_Exception.getCode(); public DomainException() { super(ResultCode.Unknown_Exception.getMessage()); } public DomainException(ResultCode resultCode) { super(resultCode.getMessage()); this.errCode = resultCode.getCode(); } public int getErrCode() { return errCode; } public void setErrCode(int errCode) { this.errCode = errCode; } }
DomainException的作用是要拋出的異常類,從代碼中可以看出它是繼承RuntimeException類的,所以可以使用throw new DomainException(ResultCode.XX);這樣就可以拋到前端。
package com.xfind.util.result; public class SuccessResultextends Result { public SuccessResult(){ } public SuccessResult(T data) { super(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), data); } }
這個(gè)類的作用是輔助類,把Code和Message都封裝到這個(gè)類,就可以直接返回到前端了。
3、設(shè)置統(tǒng)一異常處理我們再添加一個(gè)GlobalExceptionHandler類,來處理每個(gè)拋出DomainException類返回的數(shù)據(jù),前返回Result給前端了,如下所示:
/** * 統(tǒng)一異常處理 */ @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(value = DomainException.class) public Result domainExceptionHandler(HttpServletRequest req, DomainException e) throws Exception { e.printStackTrace(); Result result = new Result(e.getErrCode(), e.getMessage()); return result; } }4、測試
現(xiàn)在我們編寫一個(gè)類來測試我們剛剛寫的類的運(yùn)行情況,如下所示
@GetMapping("/isRegister") public ResponseEntity isRegister(@RequestParam String user) { boolean has_phone = smsService.isExist(user); if (has_phone) { throw new DomainException(ResultCode.PHONE_EXIST); } boolean has_email = emailService.isExist(user); if (has_email) { throw new DomainException(ResultCode.EMAIL_EXIST); } String str = "該手機(jī)號(hào)或者郵箱沒有被注冊,可以注冊本系統(tǒng)"; Result result = new SuccessResult<>(str); return ResponseEntity.ok(result); }
該方法是判斷用戶是否已經(jīng)被注冊,方法里面先判斷是否有相同手機(jī)或者郵箱,如果有就招聘異常給前端,否則則返回正確信息給前端,我們使用POSTMan來測試下
1)首先我們輸入一個(gè)已經(jīng)存在的手機(jī)號(hào)
2)我們再輸入一個(gè)已經(jīng)存在的郵箱
3)我們再輸入一個(gè)不存在存在的手機(jī)
5、總結(jié)1、首先建立一個(gè)錯(cuò)誤碼和錯(cuò)誤消息類,然后再把消息返回,返回的時(shí)候要設(shè)置成JSON拋給前端
2、我這里的消息碼使用的是int,你也可以設(shè)置成String,這個(gè)看你需求了
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/77359.html
摘要:中國開發(fā)者的年度盛會(huì)中國開發(fā)者大會(huì),于年月日在杭州舉辦了本年度的杭會(huì)議我們的和將為在現(xiàn)場為您帶來現(xiàn)場的報(bào)道,一覽大牛風(fēng)采,直擊技術(shù)熱點(diǎn)。簽到中第日的會(huì)議即將開幕以下是與參會(huì)者和與博文視點(diǎn)的作者們合影 中國JS開發(fā)者的年度盛會(huì)JS中國開發(fā)者大會(huì),于2014年6月21日在杭州舉辦了本年度的杭JS會(huì)議! 我們SegmentFault的 @integ 和 @shamiao 將為在現(xiàn)場為您帶來...
摘要:開公眾號(hào)差不多兩年了,有不少原創(chuàng)教程,當(dāng)原創(chuàng)越來越多時(shí),大家搜索起來就很不方便,因此做了一個(gè)索引幫助大家快速找到需要的文章系列處理登錄請(qǐng)求前后端分離一使用完美處理權(quán)限問題前后端分離二使用完美處理權(quán)限問題前后端分離三中密碼加鹽與中異常統(tǒng)一處理 開公眾號(hào)差不多兩年了,有不少原創(chuàng)教程,當(dāng)原創(chuàng)越來越多時(shí),大家搜索起來就很不方便,因此做了一個(gè)索引幫助大家快速找到需要的文章! Spring Boo...
摘要:版本升級(jí)每個(gè)文件方法頭標(biāo)明版本號(hào),每次修改需修改版本號(hào)大于原版本號(hào),即為版本升級(jí)。 這些天項(xiàng)目有的API出現(xiàn)版本控制問題,著實(shí)忙乎了一小陣,因?yàn)轫?xiàng)目使用TP5的傳統(tǒng)方法進(jìn)行版本控制(api目錄下進(jìn)行版本區(qū)分,由請(qǐng)求路徑?jīng)Q定使用的版本) showImg(https://segmentfault.com/img/bVbekSM?w=200&h=128); 但是問題往往是,項(xiàng)目使用了v2版本...
摘要:今天松哥就帶大家來看看的使用。此時(shí)啟動(dòng)前端項(xiàng)目,就可以順利發(fā)送網(wǎng)絡(luò)請(qǐng)求了。松哥將自己封裝的網(wǎng)絡(luò)請(qǐng)求庫已經(jīng)放在上,歡迎大家參考。前端網(wǎng)絡(luò)訪問,主流方案就是 Ajax,Vue 也不例外,在 Vue2.0 之前,網(wǎng)絡(luò)訪問較多的采用 vue-resources,Vue2.0 之后,官方不再建議使用 vue-resources ,這個(gè)項(xiàng)目本身也停止維護(hù),目前建議使用的方案是 axios。今天松哥就帶大...
閱讀 955·2023-04-25 23:54
閱讀 3036·2021-11-08 13:21
閱讀 3759·2021-09-27 13:35
閱讀 3381·2021-07-26 23:41
閱讀 1043·2019-08-30 15:52
閱讀 3431·2019-08-30 11:27
閱讀 2088·2019-08-29 18:37
閱讀 528·2019-08-29 17:24