spring boot 統一返回值

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;
    }
}

參考: https://www.cnblogs.com/viyoung/p/10188456.htmlcode

相關文章
相關標籤/搜索