SpringBoot統一返回值及異常包裝

歡迎使用Markdown編輯器寫博客

在項目開發過程中,我們希望所有接口返回值都包含四個元素。
a、code:請求接口的返回碼,成功或者異常等返回編碼,例如定義請求成功,code = “0000”,code = “1111”;

b、message:請求接口的描述,也就是對返回編碼的描述,“0000”:表示請求結果爲成功,“1111”:表示請求結果爲失敗,可以根據業務返回異常信息;

c、success:true表示接口請求成功,false表示接口請求失敗。

d、data:請求接口成功,返回的結果。

  • 自定義返回模型
/**
 * @Author: LailaiMonkey
 * @Description:
 * @Date:Created in 2020-09-28 15:58
 * @Modified By:
 */
public class WebAPIResponse<T> {
   
   

    /**
     * 是否成功
     */
    private boolean success;

    /**
     * code碼
     */
    private int code;

    /**
     * 消息內容
     */
    private String message;

    /**
     * 數據
     */
    private T data;

    public WebAPIResponse(boolean success, int code, String message, T data) {
   
   
        this.success = success;
        this.code = code;
        this.message = message;
        this.data = data;
    }

    public WebAPIResponse(T data) {
   
   
        this.success = true;
        this.code = 0;
        this.message = "success";
        this.data = data;
    }

    public WebAPIResponse(int code, String message) {
   
   
        this.success = true;
        this.code = code;
        this.message = message;
    }

    public static <T> WebAPIResponse<T> success(T data) {
   
   
        return new WebAPIResponse<>(data);
    }

    static <T> WebAPIResponse<T> fail(int code, T data) {
   
   
        return new WebAPIResponse<>(false, code, "未知錯誤異常", data);
    }

    static <T> WebAPIResponse<T> fail(int code, String message, T data) {
   
   
        return new WebAPIResponse<>(false, code, message, data);
    }

    public boolean isSuccess() {
   
   
        return success;
    }

    public void setSuccess(boolean success) {
   
   
        this.success = success;
    }

    public int getCode() {
   
   
        return code;
    }

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

    public String getMessage() {
   
   
        return message;
    }

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

    public T getData() {
   
   
        return data;
    }

    public void setData(T data) {
   
   
        this.data = data;
    }
}
  • 統一返回值和異常攔截
/**
 * @Author: 侯旭日
 * @Description:
 * @Date:Created in 2020-09-28 16:20
 * @Modified By:
 */
@RestControllerAdvice
public class WebResponseException extends WebAbstractResponseAdapter {
   
   

    private static final Logger logger = LoggerFactory.getLogger(WebResponseException.class);

	//所有異常進行包裝
    @ExceptionHandler(value = Throwable.class)
    public Object exceptionHandler(Exception e) {
   
   
        if (e instanceof BusinessExceptionImpl) {
   
   
            BusinessExceptionImpl exception = (BusinessExceptionImpl) e;
            return WebAPIResponse.fail(exception.getCode(), exception.getMessage(), null);
        }
        return WebAPIResponse.fail(0000, null);
    }

}
  • 返回值信息處理
/**
 * @Author: LailaiMonkey
 * @Description:
 * @Date:Created in 2020-10-12 15:28
 * @Modified By:
 */
abstract public class WebAbstractResponseAdapter implements ResponseBodyAdvice<Object> {
   
   

    @Override
    public boolean supports(MethodParameter methodParameter,
                            Class<? extends HttpMessageConverter<?>> converterType) {
   
   
        //過濾String類型,String單獨序列化方式
        return AbstractJackson2HttpMessageConverter.class.isAssignableFrom(converterType);
    }

    @Override
    public Object beforeBodyWrite(Object o,
                                  MethodParameter methodParameter,
                                  MediaType mediaType,
                                  Class<? extends HttpMessageConverter<?>> aClass,
                                  ServerHttpRequest serverHttpRequest,
                                  ServerHttpResponse serverHttpResponse) {
   
   

        //包裝後直接返回
        if (o instanceof WebAPIResponse) {
   
   
            return o;
        }
        return WebAPIResponse.success(o);
    }
}

我們可以向任意一個Controller發起請求,返回值都會按我們規定樣式進行包裝。

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