1、定義錯誤狀態枚舉類html
/** * @author beth * @data 2019-11-01 20:31 */ public interface IErrorCode { default Integer getCode() { return Integer.valueOf(0); } default String getMsg() { return ""; } } /** * @author beth * @data 2019-11-01 18:15 */ @Getter public enum ErrorCodeEnum implements IErrorCode { UN_KNOWN(-10000, "未知錯誤"), SUCCESS(0, "請求成功"), BAD_REQUEST(400, "參數錯誤"), UNAUTHORIZED(401, "未經受權"), FORBIDDEN(403, "沒有權限"), NOT_FOUND(404, "請求的資源不存在"), METHOD_NOT_ALLOWED(405, "請求方式不支持"), INTERNAL_SERVER_ERROR(500, "系統繁忙"), SERVICE_UNAVAILABLE(503, "服務不可用"), /** 自定義異常之返回值爲空 */ NullResponseException(5002, "返回空值"), ; /** * 狀態枚舉 * * @param code 狀態碼 * @param msg 提示信息 */ private ErrorCodeEnum(final Integer code, final String msg) { this.code = code; this.msg = msg; } private final Integer code; private final String msg; /** * 根據 code 獲取對應錯誤枚舉 * * @param code * @return */ public static ErrorCodeEnum valueOf(Integer code) { ErrorCodeEnum[] enums = ErrorCodeEnum.values(); for(ErrorCodeEnum errorCodeEnum : enums) { if(errorCodeEnum.getCode().equals(code)) { return errorCodeEnum; } } return ErrorCodeEnum.UN_KNOWN; } /** * 返回狀態碼的字符串形式 * * @return */ @Override public String toString() { return String.format(" ErrorCode:{code=%s, msg=%s} ", code, msg); } }
2、封裝返回數據前端
/** * 統必定義返回類 * @author beth * @data 2019-11-01 11:18 */ @Data public class ReturnVO { /** * 返回代碼 */ private Integer code; /** * 返回信息 */ private String message; /** * 返回數據 */ private Object data; /** * 默認構造,返回操做正確的返回代碼和信息 */ public ReturnVO() { this.setCode(ErrorCodeEnum.SUCCESS.getCode()); this.setMessage(ErrorCodeEnum.SUCCESS.getMsg()); } /** * 構造一個返回特定代碼的ReturnVO對象 * @param errorCodeEnum */ public ReturnVO(ErrorCodeEnum errorCodeEnum) { this.setCode(errorCodeEnum.getCode()); this.setMessage(errorCodeEnum.getMsg()); } /** * 默認值返回,默認返回正確的code和message * @param data */ public ReturnVO(Object data) { this.setCode(ErrorCodeEnum.SUCCESS.getCode()); this.setMessage(ErrorCodeEnum.SUCCESS.getMsg()); this.setData(data); } /** * 構造返回代碼,以及自定義的錯誤信息 * @param code * @param message */ public ReturnVO(Integer code, String message) { this.setCode(code); this.setMessage(message); } /** * 構造自定義的code,message,以及data * @param code * @param message * @param data */ public ReturnVO(Integer code, String message, Object data) { this.setCode(code); this.setMessage(message); this.setData(data); } @Override public String toString() { return "ReturnVO{" + "code='" + code + '\'' + ", message='" + message + '\'' + ", data=" + data + '}'; } }
3、使用前一步封裝的類返回數據app
/** * 新增 */ @ApiOperation(value = "新增數據") @RequestMapping(value = "/add", method = RequestMethod.POST) public ReturnVO add(@RequestBody UserInfo entity){ int result = iUserInfoService.insert(entity); if(result>0){ return new ReturnVO(); } return new ReturnVO(ErrorCodeEnum.INTERNAL_SERVER_ERROR); }
4、前端返回結果ide
5、統一封裝返回值和異常處理this
/** * 統一封裝返回值和異常處理 * @author beth * @data 2019-11-01 23:11 */ @Slf4j @Aspect @Order(5) @Component public class ResponseAop { /** * 切點 */ @Pointcut("execution(public * com.xiao.permission_system.controller..*(..))") public void httpResponse() { } /** * 環切 */ @Around("httpResponse()") public ReturnVO handlerController(ProceedingJoinPoint proceedingJoinPoint) { ReturnVO returnVO = new ReturnVO(); try { //獲取方法的執行結果 Object proceed = proceedingJoinPoint.proceed(); //若是方法的執行結果是ReturnVO,則將該對象直接返回 if (proceed instanceof ReturnVO) { returnVO = (ReturnVO) proceed; } else { //不然,就要封裝到ReturnVO的data中 returnVO.setData(proceed); } } catch (Throwable throwable) { //若是出現了異常,調用異常處理方法將錯誤信息封裝到ReturnVO中並返回 returnVO = handlerException(throwable); } return returnVO; } /** * 異常處理 */ private ReturnVO handlerException(Throwable throwable) { ReturnVO returnVO = new ReturnVO(); //這裏須要注意,返回枚舉類中的枚舉在寫的時候應該和異常的名稱相對應,以便動態的獲取異常代碼和異常信息 //獲取異常名稱的方法 String errorName = throwable.toString(); int code = errorName.lastIndexOf(".") + 1; //直接獲取properties文件中的內容 returnVO.setMessage(ErrorCodeEnum.valueOf(code).getMsg()); returnVO.setCode(code); return returnVO; } }