后端封装

245 阅读2分钟

后端响应优化

1.通用返回对象

 {
     name: "蓝书签";
 }
 ​
 ↓
 //    成功: 
 {
     "code": 200,   //业务状态码
     "data": {
         "name": "蓝书签";
             },
     "message": "ok"
 }
 //     失败:
 {
     "code": 50000,   //业务状态码
     "data": null,
     "message": "服务器内部异常",
     "description": "描述错误"(一般情况下也不加)
 }
 ​

定义BaseResponse

 /**
  * 通用返回类
  */
 @Data
 public class BaseResponse<T> implements Serializable {
 ​
     private int code;
 ​
     private T data;
 ​
     private String message;
 ​
     private String description;
 ​
     public BaseResponse(int code, T data, String message, String description) {
         this.code = code;
         this.data = data;
         this.message = message;
         this.description = description;
     }
 ​
     public BaseResponse(int code, T data, String message) {
         this(code, data, message, "");
     }
 ​
     public BaseResponse(int code, T data) {
         this(code, data, "", "");
     }
 ​
     public BaseResponse(ErrorCode errorCode) {
         this(errorCode.getCode(), null, errorCode.getMessage(), errorCode.getDescription());
     }
 }
 ​

定义ResultUtils

帮助我们new BaseResonse()

 /**
  * 返回工具类
  */
 public class ResultUtils {
 ​
     /**
      * 成功
      *
      * @param data
      * @param <T>
      * @return
      */
     public static <T> BaseResponse<T> success(T data) {
         return new BaseResponse<>(0, data, "ok");
     }
 ​
     /**
      * 失败
      *
      * @param errorCode
      * @return
      */
     public static BaseResponse error(ErrorCode errorCode) {
         return new BaseResponse<>(errorCode);
     }
 ​
     /**
      * 失败
      *
      * @param code
      * @param message
      * @param description
      * @return
      */
     public static BaseResponse error(int code, String message, String description) {
         return new BaseResponse(code, null, message, description);
     }
 ​
     /**
      * 失败
      *
      * @param errorCode
      * @return
      */
     public static BaseResponse error(ErrorCode errorCode, String message, String description) {
         return new BaseResponse(errorCode.getCode(), null, message, description);
     }
 ​
     /**
      * 失败 
      *
      * @param errorCode
      * @return
      */
     public static BaseResponse error(ErrorCode errorCode, String description) {
         return new BaseResponse(errorCode.getCode(), errorCode.getMessage(), description);
     }
 }
 ​

示例

 public BaseResponse<User> getUser(){
     //....逻辑代码
     return ResultUtils.success(data);
 }

2.封装全局异常处理

全局错误码规范:

 /**
  * 错误码
  */
 ​
 public enum ErrorCode {
 ​
     SUCCESS(0, "ok", ""),
     PARAMS_ERROR(40000, "请求参数错误", ""),
     NULL_ERROR(40001, "请求数据为空", ""),
     NOT_LOGIN(40100, "未登录", ""),
     NO_AUTH(40101, "无权限", ""),
     SYSTEM_ERROR(50000, "系统内部异常", "");
 ​
     private final int code;//状态码
 ​
     private final String message; //状态码信息
 ​
     private final String description;  //状态码描述(详细)
 ​
     ErrorCode(int code, String message, String description) {
         this.code = code;
         this.message = message;
         this.description = description;
     }
 ​
      public int getCode() {
         return code;
     }
     public String getMessage() {
         return message;
     }
     public String getDescription() {
         return description;
     }
 }
 ​

自定义业务异常

 /**
  * 自定义异常类
  */
 public class BusinessException extends RuntimeException {
 ​
     private final int code;
 ​
     private final String description;
 ​
     public BusinessException(String message, int code, String description) {
         super(message);
         this.code = code;
         this.description = description;
     }
 ​
     public BusinessException(ErrorCode errorCode) {
         super(errorCode.getMessage());
         this.code = errorCode.getCode();
         this.description = errorCode.getDescription();
     }
 ​
     public BusinessException(ErrorCode errorCode, String description) {
         super(errorCode.getMessage());
         this.code = errorCode.getCode();
         this.description = description;
     }
 ​
     public int getCode() {
         return code;
     }
 ​
     public String getDescription() {
         return description;
     }
 }

全局异常处理器

捕获代码中的所有异常,集中处理,让前端获得更加详细的业务报错

  • 目前的报错是 500 Internal Error ,我们编写全局异常处理器 不返回HTTP本身的业务码
  • 屏蔽掉项目框架本身的异常(不暴露服务器的内部状态)
  • 集中处理,比如记录日志

定义GlobalExceptionHandler

 /**
  * 全局异常处理器
  */
 @RestControllerAdvice
 @Slf4j
 public class GlobalExceptionHandler {
 ​
     @ExceptionHandler(BusinessException.class)
     public BaseResponse businessExceptionHandler(BusinessException e) {
         log.error("businessException: " + e.getMessage(), e);
         return ResultUtils.error(e.getCode(), e.getMessage(), e.getDescription());
     }
 ​
     @ExceptionHandler(RuntimeException.class)
     public BaseResponse runtimeExceptionHandler(RuntimeException e) {
         log.error("runtimeException", e);
         return ResultUtils.error(ErrorCode.SYSTEM_ERROR, e.getMessage(), "");
     }
 }
 ​

\