歡迎使用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發起請求,返回值都會按我們規定樣式進行包裝。