Springboot + vue前后端分离后台管理系统(3)之数据封装

一、统一返回结果封装

一般情况下,统一返回数据格式没有固定的格式,只要能描述清楚返回的数据状态以及要返回的具体数据就可以。但是一般会包含状态码、返回消息、数据这几部分内容
例如,我们的系统要求返回的基本数据格式如下:
{
  "success": true,
  "code": 200,
  "message": "成功",
  "data": {
    "items": [
      {
        "id": "1",
        "name": "刘德华",
        "intro": "毕业于师范大学数学系,热爱教育事业,执教数学思维6年有余"
      }
    ]
  }
}

在common包下定义ResultCodeMenu.java统一管理响应码

@Getter
public enum ResultCodeEnum {

    /**
     * 成功
     */
    SUCCESS(200, "ok"),
    /**
     * 请求错误
     */
    BAD_REQUEST(400, "请求参数错误"),
    /**
     * 未登录授权
     */
    UNAUTHORIZED(401, "无效令牌"),
    /**
     * 权限不足
     */
    FORBIDDEN(403, "权限不足"),
    /**
     * 服务器错误
     */
    FAILED(500, "server error"),
    /**
     * 业务异常
     */
    BUSINESS_ERROR(600, "业务异常");

    /** 错误码 */
    private Integer code;

    /** 错误信息 */
    private String message;

    private ResultCodeEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
}

定义统一响应对象

public class Result {

    /** * 响应码 */
    private Integer code;

    /** * 响应消息 */
    private String message;

    /*** 响应数据 */
    private Map<String, Object> data = new HashMap<String, Object>();

    public Result() {}
    /**
     * 请求成功
     * @return
     */
    public static Result ok() {
        Result result = new Result();
        result.setCode(ResultCodeEnum.SUCCESS.getCode());
        result.setMessage(ResultCodeEnum.SUCCESS.getMessage());
        return result;
    }

    /**
     * 服务器异常
     * @return
     */
    public static Result error() {
        Result result = new Result();
        result.setCode(ResultCodeEnum.FAILED.getCode());
        result.setMessage(ResultCodeEnum.FAILED.getMessage());
        return result;
    }

    /**
     * 业务异常
     * @return
     */
    public static Result businessError(){
        Result result = new Result();
        result.setCode(ResultCodeEnum.BUSINESS_ERROR.getCode());
        result.setMessage(ResultCodeEnum.BUSINESS_ERROR.getMessage());
        return result;
    }

    /**
     * 枚举值异常
     * @param resultCodeEnum
     * @return
     */
    public static Result resultCodeEnum(ResultCodeEnum resultCodeEnum){
        Result result = new Result();
        result.setCode( resultCodeEnum.getCode());
        result.setMessage(resultCodeEnum.getMessage());
        return result;
    }


    /**
     * 添加key-value数据
     * @param key
     * @param value
     * @return
     */
    public Result data(String key, Object value) {
        this.data.put(key, value);
        return this;
    }

    /**
     * 添加map数据
     * @param map
     * @return
     */
    public Result data(Map<String, Object> map) {
        this.setData(map);
        return this;
    }

    public Integer getCode() {
        return code;
    }

    public Result setCode(Integer code) {
        this.code = code;
        return this;
    }

    public String getMessage() {
        return message;
    }

    public Result setMessage(String message) {
        this.message = message;
        return this;
    }

    public Map<String, Object> getData() {
        return data;
    }

    public Result setData(Map<String, Object> data) {
        this.data = data;
        return this;
    }
}

二 、统一异常处理

2.1  自定义异常类

public class BusinessException extends RuntimeException {
    /**
     * 异常信息
     */
    private Integer code;

    public BusinessException(String message, Integer code) {
        super(message);
        this.code = code;
    }
    /*** 抛出业务异常信息,用于全局自定义抛出异常 */
    public BusinessException(String message){
        super(message);
        this.code = ResultCodeEnum.BUSINESS_ERROR.getCode();
    }

    public void setCode(Integer code){
        this.code = code;
    }

    public Integer getCode(){
        return this.code;
    }
}

2.2 定义全局异常拦截器

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 拦截自定义业务异常
     * @param businessException
     * @return
     */
    @ExceptionHandler(BusinessException.class)
    public Result handleBusinessException(BusinessException businessException){
        log.error(businessException.getMessage());
        return Result.businessError().setMessage(businessException.getMessage());
    }

    /**
     * 功能描述:  捕获请求参数异常 @valid校验参数方式 (如果采用这种方式的话可以进行使用)
     */
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result handleBadRequestException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        List<String> errors = new ArrayList<>();
        for (FieldError fieldError : bindingResult.getFieldErrors()) {
            log.error(fieldError.getDefaultMessage());
            errors.add(fieldError.getDefaultMessage());
        }
        return  Result.resultCodeEnum(ResultCodeEnum.BAD_REQUEST)
                      .data("errorMsg",errors);
    }

    /**
     * 参数校验异常
     * @param e
     * @return
     */
    @ExceptionHandler(BindException.class)
    public Result handleBindException( BindException e ){
        BindingResult bindingResult = e.getBindingResult();
        List<String> errors = new ArrayList<>();
        for (FieldError fieldError : bindingResult.getFieldErrors()) {
            log.error(fieldError.getDefaultMessage());
            errors.add(fieldError.getDefaultMessage());
        }
        return  Result.resultCodeEnum(ResultCodeEnum.BAD_REQUEST)
                .data("errorMsg",errors);
    }

    /**
     * 其它异常
     * @param exception
     * @return
     */
    @ExceptionHandler(Exception.class)
    public Result handleException(Exception exception){
        log.error(exception.getMessage());
        return Result.error().setMessage(exception.getMessage());
    }
}

 

Guess you like

Origin blog.csdn.net/jatej/article/details/114577586