SpringBoot全局處理統(tǒng)一返回類型方式
SpringBoot全局處理統(tǒng)一返回類型
在日常開發(fā)中,我們會定義各種各樣的返回類型,不便于后期維護(hù),也不便于前臺進(jìn)行數(shù)據(jù)處理;有些項(xiàng)目會封裝一個(gè)統(tǒng)一的返回類型,讓開發(fā)人員用這個(gè)封裝類返回,但是隨著項(xiàng)目人員的變更,如果沒有統(tǒng)一的要求規(guī)范,后期也會變得不可控,而且代碼的耦合度也太高。
基于此場景,我們封裝了一個(gè)統(tǒng)一返回類型(響應(yīng)狀態(tài)、返回?cái)?shù)據(jù)等),并設(shè)置全局統(tǒng)一處理。
接口調(diào)用返回如下所示:
{ "code": 200, //響應(yīng)狀態(tài) "cost": 0, //請求耗時(shí),在本文章不做演示 "data": "test",//返回?cái)?shù)據(jù) "msg": "成功" //響應(yīng)描述 }
需要的依賴
首先添加需要的依賴
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.9</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
Result(返回類)
然后,我們定義一個(gè)返回類,全局返回統(tǒng)一采用本模板返回,包含一個(gè)前端常用字段,還有一些初始化對象的方法。
package com.gml.springboot2.entity; import com.gml.springboot2.enums.ResultEnum; import lombok.Data; import java.io.Serializable; /** * @author gml * @description 全局統(tǒng)一返回類型 * @date 2019/11/29 */ @Data @NoArgsConstructor @AllArgsConstructor public class Result<T> implements Serializable { /** * 成功數(shù)據(jù) */ private T data; /** * 響應(yīng)編碼200為成功 */ private Integer code; /** * 請求消耗時(shí)間 */ private long cost; /** * 描述 */ private String msg; /** * 請求id */ private String requestId; public Result(Integer code, String msg) { this.code = code; this.msg = msg; } public static Result create(Integer code, String msg){ Result result = new Result(code, msg); return result; } /** * 無數(shù)據(jù)返回成功 * @return */ public static Result createSuccess() { return create(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMsg()); } /** * 有數(shù)據(jù)返回成功 * @param data * @param <T> * @return */ public static <T> Result<T> createSuccess(T data) { return createSuccess().setData(data); } /** * 無描述返回失敗 * @return */ public static Result createFail() { return create(ResultEnum.Fail.getCode(), ResultEnum.Fail.getMsg()); } /** * 自定義返回失敗描述 * @param code * @param msg * @return */ public static Result createFail(Integer code, String msg) { return create(code, msg); } public Result setData(T data){ this.data = data; return this; } }
全局設(shè)置
實(shí)現(xiàn)ResponseBodyAdvice接口,ResponseBodyAdvice是Spring4.1新加入的接口,在消息體被HttpMessageConverter寫入之前允許Controller中的方法調(diào)整響應(yīng)中的內(nèi)容,比如做一些返回處理。
ResponseBodyAdvice接口里面一共定義了兩個(gè)方法
supports
:進(jìn)行一些邏輯判斷是否需要進(jìn)行后續(xù)的beforeBodyWrite的方法beforeBodyWrite
:進(jìn)行一些返回處理
然后一定一個(gè)類實(shí)現(xiàn)ResponseBodyAdvice接口,代碼如下:
package com.gml.springboot2.config; import com.alibaba.fastjson.JSONObject; import com.gml.springboot2.entity.Result; import org.springframework.core.MethodParameter; import org.springframework.http.MediaType; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; import java.util.Objects; /** * @author gml * @description * @date 2019/11/29 */ @RestControllerAdvice public class CommonResponseAdvice implements ResponseBodyAdvice { @Override public boolean supports(MethodParameter methodParameter, Class aClass) { return filter(methodParameter); } /** * 根據(jù)返回類型來判斷是否需要進(jìn)行后續(xù)操作 * @param methodParameter * @return */ private boolean filter(MethodParameter methodParameter) { return true; } /** * * @param returnValue 返回值 * @param methodParameter Controller方法返回類型 * @param mediaType * @param aClass * @param serverHttpRequest * @param serverHttpResponse * @return */ @Override public Object beforeBodyWrite(Object returnValue, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { Result result; //獲取返回值類型 String returnClassType = returnType.getParameterType().getSimpleName(); //如果返回值類型為void,則默認(rèn)返回成功 if("void".equals(returnClassType)){ result = Result.createSuccess(); }else if ("Result".equals(returnClassType)){ result = (Result) returnValue; }else if ("String".equals(returnClassType)){ //json的轉(zhuǎn)換會出問題 result = Result.createSuccess(returnValue); result.setCost(cost); return JSON.toJSONString(result); }else { if (Objects.isNull(returnValue)){ result = Result.createSuccess(); }else { result = Result.createSuccess(returnValue); } } //一定要轉(zhuǎn)換為String,否則會報(bào)錯(cuò) return result; } }
測試
寫一個(gè)Controller,測試一下返回值
package com.gml.springboot2.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @author gml * @description * @date 2019/11/29 */ @RestController public class TestController { @RequestMapping("/test") public String test(){ return "返回?cái)?shù)據(jù)"; } }
瀏覽器訪問如下圖
測試成功~
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot統(tǒng)一數(shù)據(jù)返回格式的實(shí)現(xiàn)示例
- SpringBoot如何統(tǒng)一處理返回結(jié)果和異常情況
- 詳解SpringBoot中的統(tǒng)一結(jié)果返回與統(tǒng)一異常處理
- Springboot設(shè)置統(tǒng)一的返回格式的方法步驟
- SpringBoot返回結(jié)果統(tǒng)一處理實(shí)例詳解
- 淺析SpringBoot統(tǒng)一返回結(jié)果的實(shí)現(xiàn)
- SpringBoot統(tǒng)一返回結(jié)果問題
- 詳解SpringBoot如何統(tǒng)一處理返回的信息
- SpringBoot統(tǒng)一返回格式的方法詳解
- SpringBoot統(tǒng)一數(shù)據(jù)返回的幾種方式
相關(guān)文章
Java基于裝飾者模式實(shí)現(xiàn)的染色饅頭案例詳解
這篇文章主要介紹了Java基于裝飾者模式實(shí)現(xiàn)的染色饅頭案例,簡單描述了裝飾者模式的概念、原理及Java使用裝飾者模式的相關(guān)實(shí)現(xiàn)步驟、操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-05-05Mybatis關(guān)聯(lián)查詢之一對多和多對一XML配置詳解
這篇文章主要介紹了Mybatis關(guān)聯(lián)查詢之一對多和多對一XML配置詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10java向下轉(zhuǎn)型基礎(chǔ)知識點(diǎn)及實(shí)例
在本篇文章里小編給大家整理的是一篇關(guān)于java向下轉(zhuǎn)型基礎(chǔ)知識點(diǎn)及實(shí)例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-05-05Java分別利用深度優(yōu)先和廣度優(yōu)先求解迷宮路徑
這篇文章主要為大家詳細(xì)介紹了Java如何利用深度優(yōu)先的非遞歸遍歷方法和廣度優(yōu)先的遍歷方法實(shí)現(xiàn)求解迷宮路徑,文中的示例代碼講解詳細(xì),需要的可以參考一下2022-08-08JAVA 根據(jù)設(shè)置的概率生成隨機(jī)數(shù)的方法
本篇文章主要介紹了JAVA 根據(jù)設(shè)置的概率生成隨機(jī)數(shù)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08Java接口返回省市區(qū)樹形結(jié)構(gòu)的實(shí)現(xiàn)
本文主要介紹了Java接口返回省市區(qū)樹形結(jié)構(gòu)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01