spring boot --- result 統一的結果集處理

1 url的命名

在實際開發中名詞居多,見名知意

  • get 獲取數據
  • post 添加數據
  • put 修改數據
  • delete 邏輯假刪除

2 返回數據的格式

2.1 一般返回的是json數據 {狀態碼: 信息}

**一些常用的返回狀態碼 **

https://help.aliyun.com/knowledge_detail/36393.html?spm=5176.10695662.1996646101.searchclickresult.33f71bb4EstSUR&aly_as=Gf1sQix

2.2 直接在Controller中調用靜態方法

2.2.1 先創建一個返回集的接口

public interface Result<T> {

}

2.2.2 定義返回信息枚舉類型

public enum StatusTypeEnum {
    /**
     * 200爲成功
     * 404爲錯誤信息
     */
    SUCCESS(200,"success"),
    ERROR(404,"error");

    private String msg;
    private int status;

    StatusTypeEnum(int status, String msg) {
        this.status = status;
        this.msg = msg;
    }
}


2.2.3 創建successResult返回集繼承返回集接口

@Data
@AllArgsConstructor
@NoArgsConstructor
public class SuccessResult<T> implements Result<T> {
    private StatusTypeEnum status;
    private T data;

    public static SuccessResult succes() {
        return new SuccessResult<>(StatusTypeEnum.SUCCESS, null);
    }

    public static <T> SuccessResult succes(T data) {
        return new SuccessResult<>(StatusTypeEnum.SUCCESS, data);
    }

}

2.2.4 創建errorResult返回集繼承返回集接口

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ErrorResult implements Result {
    private StatusTypeEnum status;
    private String msg;
    

    public static ErrorResult error(int status, Exception ex) {
        return new ErrorResult(StatusTypeEnum.ERROR, ex.getMessage());
    }
    public static ErrorResult error() {
        return new ErrorResult(StatusTypeEnum.ERROR, "錯誤");
    }

}

定義的內容需要根據業務不同來定,這個只是大體架構

2.3 利用AOP切面變成

@RestControllerAdvice + 實現ResponseBodyAdvice

將Result 封裝到aop 中, Controller層 直接返回 參數,讓aop去判斷,返回的Result

@RestControllerAdvice
@Slf4j
public class GlobalResultAdvice  implements ResponseBodyAdvice {
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        log.error("supports");
        //爲false 將不執行下面的aop方法
        return true;
    }

    /**
     *
     * @param body
     * @param returnType
     * @param selectedContentType
     * @param selectedConverterType
     * @param request
     * @param response
     * @return
     */
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        Object resp = null;
        if (body instanceof SuccessResult){
            resp = body;
        }else{
            resp =  SuccessResult.succes(body);
        }

        return resp;
    }

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章