SpringBoot+Response如何統(tǒng)一返回result結(jié)果集
SpringBoot+Response統(tǒng)一返回result結(jié)果集
在SpringBoot開發(fā)接口中,通常會(huì)對java api統(tǒng)一返回result結(jié)果集,前端或者調(diào)用放可以根據(jù)返回的result結(jié)果集判斷請求得到的數(shù)據(jù)是否正確,是否有效,一般情況下,使用java自定義的result結(jié)果集封裝。
java統(tǒng)一返回?cái)?shù)據(jù)格式
Response.java
//import com.fasterxml.jackson.annotation.JsonInclude; /** * 螞蟻舞 */ //@JsonInclude(JsonInclude.Include.NON_NULL) public class Response { private boolean state; private int code; private String msg; private Object data; private long timestamp; public Response() {} public Response(boolean state, int code, String msg) { this.state = state; this.code = code; this.msg = msg; this.timestamp = System.currentTimeMillis()/1000; } public Response(boolean state, int code, String msg, Object data) { this.state = state; this.code = code; this.msg = msg; this.data = data; this.timestamp = System.currentTimeMillis()/1000; } public boolean isState() { return state; } public void setState(boolean state) { this.state = state; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } public long getTimestamp() { return timestamp; } public void setTimestamp(long timestamp) { this.timestamp = timestamp; } @Override public String toString() { return "Response{" + "state=" + state + ", code=" + code + ", msg='" + msg + '\'' + ", data=" + data + ", timestamp=" + timestamp + '}'; } }
java返回結(jié)果統(tǒng)一封裝 靜態(tài)類
ResponseCode.java
/** * 螞蟻舞 */ public class ResponseCode { private static final boolean STATE_TRUE = true; private static final boolean STATE_FALSE = false; private static final int CODE_200 = 200; //操作資源成功 private static final int CODE_201 = 201; //資源為空 private static final int CODE_100 = 100; //操作資源失敗 private static final int CORE_101 = 101; //缺少必要參數(shù) private static final int CORE_102 = 102; //參數(shù)無效返回 private static final int CORE_303 = 303; //請求token無效或者token失效到期 提示前端后,前端用戶可手動(dòng)刷新重新登陸 private static final int CORE_304 = 304; //請求token無效或者token失效到期 提示前端后,前端自動(dòng)跳轉(zhuǎn)到登錄頁面 private static final int CORE_305 = 305; //未攜帶token認(rèn)證信息,提示前端后,前端用戶可手動(dòng)刷新重新登陸 private static final int CORE_306 = 306; //未攜帶token認(rèn)證信息,提示前端后,前端自動(dòng)跳轉(zhuǎn)到登錄頁面 private static final int CORE_307 = 307; //未登錄 前端用戶可手動(dòng)跳轉(zhuǎn)到登錄頁面 private static final int CORE_308 = 308; //未登錄 前端自動(dòng)跳轉(zhuǎn)到登錄頁面 private static final int CORE_400 = 400; //全局異常 private static final int CORE_600 = 600; //您的權(quán)限不夠 private static final int CORE_601 = 601; //未經(jīng)授權(quán)不可訪問 private static final String MSG_ALL_SUCCESS = "操作資源成功"; private static final String MSG_SELECT_SUCCESS = "獲取資源成功"; private static final String MSG_UPDATE_SUCCESS = "更新資源成功"; private static final String MSG_INSERT_SUCCESS = "新增資源成功"; private static final String MSG_REMOVE_SUCCESS = "移除資源成功"; private static final String MSG_DELETE_SUCCESS = "刪除資源成功"; private static final String MSG_ALL_FAIL = "操作資源失敗"; private static final String MSG_SELECT_FAIL = "獲取資源失敗"; private static final String MSG_UPDATE_FAIL = "更新資源失敗"; private static final String MSG_INSERT_FAIL = "新增資源失敗"; private static final String MSG_REMOVE_FAIL = "移除資源失敗"; private static final String MSG_DELETE_FAIL = "刪除資源失敗"; private static final String MSG_RESOURCES_EMPTY = "資源為空"; private static final String MSG_PARAMETER_LACK = "缺少必要參數(shù)"; private static final String MSG_PARAMETER_INVALID = "參數(shù)無效"; private static final String MSG_EXCEPTION_GLOBAL = "操作異常,請重新嘗試"; private static final String MSG_TOKEN_INVALID = "請求token無效或者token失效到期"; private static final String MSG_TOKEN_INVALID_SKIP = "請求token無效或者token失效到期,自動(dòng)跳轉(zhuǎn)登錄頁"; private static final String MSG_TOKEN_NO_AUTH = "未攜帶token認(rèn)證信息,請重新登陸"; private static final String MSG_TOKEN_NO_AUTH_SKIP = "未攜帶token認(rèn)證信息,請重新登陸, 自動(dòng)跳轉(zhuǎn)到登錄頁"; private static final String MSG_TOKEN_NO_LOGIN = "未登錄,請登錄"; private static final String MSG_TOKEN_NO_LOGIN_SKIP = "未登錄,請登錄 自動(dòng)跳轉(zhuǎn)到登錄頁"; private static final String MSG_TOKEN_NO_PERMISSION = "未經(jīng)授權(quán)的不可訪問"; private static final String MSG_TOKEN_NOT_PERMISSION = "您的權(quán)限不足"; /** * 未登錄,請登錄 */ public static Response noLoginResponse(){ return new Response(STATE_FALSE,CORE_307,MSG_TOKEN_NO_LOGIN); } public static Response noLoginResponse(String msg){ return new Response(STATE_FALSE,CORE_307,msg); } public static Response noLoginSkipResponse(){ return new Response(STATE_FALSE,CORE_308,MSG_TOKEN_NO_LOGIN_SKIP); } public static Response noLoginSkipResponse(String msg){ return new Response(STATE_FALSE,CORE_308,msg); } // 未攜帶token認(rèn)證信息,請重新登陸 public static Response noAuthHeaderTokenResponse(){ return new Response(STATE_FALSE,CORE_305,MSG_TOKEN_NO_AUTH); } public static Response noAuthHeaderTokenResponse(String msg){ return new Response(STATE_FALSE,CORE_305,msg); } // 未攜帶token認(rèn)證信息,提示前端后,前端自動(dòng)跳轉(zhuǎn)到登錄頁面 public static Response noAuthHeaderTokenSkipResponse(){ return new Response(STATE_FALSE,CORE_306,MSG_TOKEN_NO_AUTH_SKIP); } public static Response noAuthHeaderTokenSkipResponse(String msg){ return new Response(STATE_FALSE,CORE_306,msg); } // 請求token無效或者token失效到期 public static Response invalidHeaderTokenResponse(){ return new Response(STATE_FALSE,CORE_303,MSG_TOKEN_INVALID); } public static Response invalidHeaderTokenResponse(String msg){ return new Response(STATE_FALSE,CORE_303,msg); } // 請求token無效或者token失效到期 前端可根據(jù)此項(xiàng)code跳轉(zhuǎn)到登錄頁 public static Response invalidHeaderTokenSkipResponse(){ return new Response(STATE_FALSE,CORE_304,MSG_TOKEN_INVALID_SKIP); } public static Response invalidHeaderTokenSkipResponse(String msg){ return new Response(STATE_FALSE,CORE_304,msg); } // 全局異常返回 public static Response exceptionResponse(){ return new Response(STATE_FALSE,CORE_400,MSG_EXCEPTION_GLOBAL); } public static Response exceptionResponse(String msg){ return new Response(STATE_FALSE,CORE_400,msg); } // 您的權(quán)限不足 public static Response notPermissionResponse(){ return new Response(STATE_FALSE,CORE_600,MSG_TOKEN_NOT_PERMISSION); } public static Response notPermissionResponse(String msg){ return new Response(STATE_FALSE,CORE_600,msg); } // 未經(jīng)授權(quán)的不可訪問 public static Response unauthorizedPermissionResponse(){ return new Response(STATE_FALSE,CORE_601,MSG_TOKEN_NO_PERMISSION); } public static Response unauthorizedPermissionResponse(String msg){ return new Response(STATE_FALSE,CORE_601,msg); } // 缺少必要參數(shù)返回 public static Response lackParameterResponse(){ return new Response(STATE_FALSE, CORE_101, MSG_PARAMETER_LACK); } public static Response lackParameterResponse(String msg){ return new Response(STATE_FALSE, CORE_101, msg); } // 參數(shù)無效通用返回 public static Response invalidParameterResponse(){ return new Response(STATE_FALSE, CORE_102, MSG_PARAMETER_INVALID); } public static Response invalidParameterResponse(String msg){ return new Response(STATE_FALSE, CORE_102, msg); } // 新增成功返回 public static Response successInsertResponse(){ return new Response(STATE_TRUE,CODE_200,MSG_INSERT_SUCCESS); } public static Response successInsertResponse(Object data){ return new Response(STATE_TRUE,CODE_200,MSG_INSERT_SUCCESS,data); } // 更新成功返回 public static Response successUpdateResponse(){ return new Response(STATE_TRUE,CODE_200,MSG_UPDATE_SUCCESS); } // 查詢成功返回 public static Response successSelectResponse(){ return new Response(STATE_TRUE,CODE_200,MSG_SELECT_SUCCESS); } public static Response successSelectResponse(Object data){ return new Response(STATE_TRUE, CODE_200, MSG_SELECT_SUCCESS, data); } // 移除成功返回 public static Response successRemoveResponse(){ return new Response(STATE_TRUE,CODE_200,MSG_REMOVE_SUCCESS); } // 刪除成功返回 public static Response successDeleteResponse(){ return new Response(STATE_TRUE,CODE_200,MSG_DELETE_SUCCESS); } // 通用success返回 public static Response successResponse(){ return new Response(STATE_TRUE,CODE_200,MSG_ALL_SUCCESS); } public static Response successResponse(String msg){ return new Response(STATE_TRUE,CODE_200,msg); } public static Response successResponse(Object data){ return new Response(STATE_TRUE,CODE_200,MSG_ALL_SUCCESS, data); } public static Response successResponse(String msg, Object data){ return new Response(STATE_TRUE,CODE_200,msg, data); } // 查詢結(jié)果為空時(shí)成功返回(沒有獲取到數(shù)據(jù)) public static Response successEmptyResponse(){ return new Response(STATE_TRUE,CODE_201,MSG_RESOURCES_EMPTY); } public static Response successEmptyResponse(String msg){ return new Response(STATE_TRUE,CODE_201,msg); } public static Response successEmptyResponse(Object data){ return new Response(STATE_TRUE,CODE_201,MSG_RESOURCES_EMPTY,data); } // 新增失敗返回 public static Response failInsertResponse(){ return new Response(STATE_FALSE,CODE_100,MSG_INSERT_FAIL); } public static Response failInsertResponse(String msg){ return new Response(STATE_FALSE,CODE_100,msg); } // 更新失敗返回 public static Response failUpdateResponse(){ return new Response(STATE_FALSE,CODE_100,MSG_UPDATE_FAIL); } public static Response failUpdateResponse(String msg){ return new Response(STATE_FALSE,CODE_100,msg); } // 查詢失敗返回 public static Response failSelectResponse(){ return new Response(STATE_FALSE,CODE_100,MSG_SELECT_FAIL); } public static Response failSelectResponse(String msg){ return new Response(STATE_FALSE,CODE_100,msg); } // 移除失敗返回 public static Response failRemoveResponse(){ return new Response(STATE_FALSE,CODE_100,MSG_REMOVE_FAIL); } public static Response failRemoveResponse(String msg){ return new Response(STATE_FALSE,CODE_100,msg); } // 刪除失敗返回 public static Response failDeleteResponse(){ return new Response(STATE_FALSE,CODE_100,MSG_DELETE_FAIL); } public static Response failDeleteResponse(String msg){ return new Response(STATE_FALSE,CODE_100,msg); } // 通用fail返回 public static Response failResponse(){ return new Response(STATE_FALSE,CODE_100,MSG_ALL_FAIL); } public static Response failResponse(String msg){ return new Response(STATE_FALSE,CODE_100,msg); } public static Response failResponse(String msg, Object data){ return new Response(STATE_FALSE,CODE_100,msg,data); } // 自定義返回結(jié)果 public static Response customizeResponse(boolean state, int code, String msg){ return new Response(state,code,msg); } public static Response customizeResponse(boolean state, int code, String msg, Object data){ return new Response(state, code, msg, data); } }
springboot result統(tǒng)一的結(jié)果集處理
1 url的命名
在實(shí)際開發(fā)中名詞居多,見名知意
- get 獲取數(shù)據(jù)
- post 添加數(shù)據(jù)
- put 修改數(shù)據(jù)
- delete 邏輯假刪除
2 返回?cái)?shù)據(jù)的格式
2.1 一般返回的是json數(shù)據(jù) {狀態(tài)碼: 信息}
**一些常用的返回狀態(tài)碼 **
2.2 直接在Controller中調(diào)用靜態(tài)方法
- 2.2.1 先創(chuàng)建一個(gè)返回集的接口
public interface Result<T> { }
- 2.2.2 定義返回信息枚舉類型
public enum StatusTypeEnum { /** * 200為成功 * 404為錯(cuò)誤信息 */ 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 創(chuàng)建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 創(chuàng)建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, "錯(cuò)誤"); } }
定義的內(nèi)容需要根據(jù)業(yè)務(wù)不同來定,這個(gè)只是大體架構(gòu)
2.3 利用AOP切面變成
@RestControllerAdvice + 實(shí)現(xiàn)ResponseBodyAdvice
將Result 封裝到aop 中, Controller層 直接返回 參數(shù),讓aop去判斷,返回的Result
@RestControllerAdvice @Slf4j public class GlobalResultAdvice implements ResponseBodyAdvice { @Override public boolean supports(MethodParameter returnType, Class converterType) { log.error("supports"); //為false 將不執(zhí)行下面的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; } }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
IntelliJ IDEA 使用經(jīng)驗(yàn)總結(jié)(推薦)
這篇文章主要介紹了IntelliJ IDEA 使用經(jīng)驗(yàn)總結(jié),非常不錯(cuò),具有參考價(jià)值,需要的朋友可以參考下2018-02-02詳解IDEA用maven創(chuàng)建springMVC項(xiàng)目和配置
本篇文章主要介紹了詳解IDEA用maven創(chuàng)建springMVC項(xiàng)目和配置 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09參數(shù)校驗(yàn)Spring的@Valid注解用法解析
這篇文章主要介紹了參數(shù)校驗(yàn)Spring的@Valid注解用法,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Spring+SpringMVC+Hibernate整合實(shí)例講解
在本篇文章里小編給大家整理的是關(guān)于Spring+SpringMVC+Hibernate整合實(shí)例講解,需要的朋友們可以學(xué)習(xí)下。2020-03-03Java?8函數(shù)式接口之BinaryOperator使用示例詳解
這篇文章主要大家介紹了Java?8函數(shù)式接口之BinaryOperator,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07springboot整合jquery和bootstrap框架過程圖解
這篇文章主要介紹了springboot整合jquery和bootstrap框架過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12