SpringBoot全局處理統(tǒng)一返回類(lèi)型方式
SpringBoot全局處理統(tǒng)一返回類(lèi)型
在日常開(kāi)發(fā)中,我們會(huì)定義各種各樣的返回類(lèi)型,不便于后期維護(hù),也不便于前臺(tái)進(jìn)行數(shù)據(jù)處理;有些項(xiàng)目會(huì)封裝一個(gè)統(tǒng)一的返回類(lèi)型,讓開(kāi)發(fā)人員用這個(gè)封裝類(lèi)返回,但是隨著項(xiàng)目人員的變更,如果沒(méi)有統(tǒng)一的要求規(guī)范,后期也會(huì)變得不可控,而且代碼的耦合度也太高。
基于此場(chǎng)景,我們封裝了一個(gè)統(tǒng)一返回類(lèi)型(響應(yīng)狀態(tài)、返回?cái)?shù)據(jù)等),并設(shè)置全局統(tǒng)一處理。
接口調(diào)用返回如下所示:
{
"code": 200, //響應(yīng)狀態(tài)
"cost": 0, //請(qǐng)求耗時(shí),在本文章不做演示
"data": "test",//返回?cái)?shù)據(jù)
"msg": "成功" //響應(yīng)描述
}需要的依賴(lài)
首先添加需要的依賴(lài)
<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(返回類(lèi))
然后,我們定義一個(gè)返回類(lèi),全局返回統(tǒng)一采用本模板返回,包含一個(gè)前端常用字段,還有一些初始化對(duì)象的方法。
package com.gml.springboot2.entity;
import com.gml.springboot2.enums.ResultEnum;
import lombok.Data;
import java.io.Serializable;
/**
* @author gml
* @description 全局統(tǒng)一返回類(lèi)型
* @date 2019/11/29
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> implements Serializable {
/**
* 成功數(shù)據(jù)
*/
private T data;
/**
* 響應(yīng)編碼200為成功
*/
private Integer code;
/**
* 請(qǐng)求消耗時(shí)間
*/
private long cost;
/**
* 描述
*/
private String msg;
/**
* 請(qǐng)求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;
}
/**
* 無(wú)數(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);
}
/**
* 無(wú)描述返回失敗
* @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寫(xiě)入之前允許Controller中的方法調(diào)整響應(yīng)中的內(nèi)容,比如做一些返回處理。
ResponseBodyAdvice接口里面一共定義了兩個(gè)方法
supports:進(jìn)行一些邏輯判斷是否需要進(jìn)行后續(xù)的beforeBodyWrite的方法beforeBodyWrite:進(jìn)行一些返回處理
然后一定一個(gè)類(lèi)實(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ù)返回類(lèi)型來(lái)判斷是否需要進(jìn)行后續(xù)操作
* @param methodParameter
* @return
*/
private boolean filter(MethodParameter methodParameter) {
return true;
}
/**
*
* @param returnValue 返回值
* @param methodParameter Controller方法返回類(lèi)型
* @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;
//獲取返回值類(lèi)型
String returnClassType = returnType.getParameterType().getSimpleName();
//如果返回值類(lèi)型為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)換會(huì)出問(wè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,否則會(huì)報(bào)錯(cuò)
return result;
}
}測(cè)試
寫(xiě)一個(gè)Controller,測(cè)試一下返回值
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ù)";
}
}瀏覽器訪問(wèn)如下圖

測(cè)試成功~
總結(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é)果問(wèn)題
- 詳解SpringBoot如何統(tǒng)一處理返回的信息
- SpringBoot統(tǒng)一返回格式的方法詳解
- SpringBoot統(tǒng)一數(shù)據(jù)返回的幾種方式
相關(guān)文章
Postman實(shí)現(xiàn)傳List<String>集合
這篇文章主要介紹了Postman實(shí)現(xiàn)傳List<String>集合方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
使用Java程序化地在Excel工作表中應(yīng)用各種條件格式
在數(shù)據(jù)分析和報(bào)表制作過(guò)程中,快速識(shí)別關(guān)鍵數(shù)據(jù)、異常值和趨勢(shì)是提高工作效率的關(guān)鍵,本文將介紹如何使用 Java 程序化地在 Excel 工作表中應(yīng)用各種條件格式,需要的朋友可以參考下2026-04-04
圖文講解Java中實(shí)現(xiàn)quickSort快速排序算法的方法
這篇文章主要介紹了Java中實(shí)現(xiàn)quickSort快速排序算法的方法,文章最后還介紹了一種單向掃描的實(shí)現(xiàn)方法,需要的朋友可以參考下2016-05-05
springboot定時(shí)任務(wù)@Scheduled執(zhí)行多次的問(wèn)題
這篇文章主要介紹了springboot定時(shí)任務(wù)@Scheduled執(zhí)行多次問(wèn)題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Java中的HashMap弱引用之WeakHashMap詳解
這篇文章主要介紹了Java中的HashMap弱引用之WeakHashMap詳解,當(dāng)內(nèi)存空間不足,Java虛擬機(jī)寧愿拋出OutOfMemoryError錯(cuò)誤,使程序異常終止,也不會(huì)靠隨意回收具有強(qiáng)引用的對(duì)象來(lái)解決內(nèi)存不足的問(wèn)題,需要的朋友可以參考下2023-09-09
SpringBoot后端接收參數(shù)優(yōu)化代碼示例(統(tǒng)一處理前端參數(shù))
使用Spring Boot開(kāi)發(fā)API的時(shí)候,讀取請(qǐng)求參數(shù)是服務(wù)端編碼中最基本的一項(xiàng)操作,下面這篇文章主要給大家介紹了關(guān)于SpringBoot后端接收參數(shù)優(yōu)化(統(tǒng)一處理前端參數(shù))的相關(guān)資料,需要的朋友可以參考下2024-07-07
spring?MVC實(shí)現(xiàn)簡(jiǎn)單登錄功能
這篇文章主要為大家詳細(xì)介紹了spring?MVC實(shí)現(xiàn)簡(jiǎn)單登錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09
Java編程實(shí)現(xiàn)用hash方法切割文件
這篇文章主要介紹了Java編程實(shí)現(xiàn)用hash方法切割文件,簡(jiǎn)單介紹了hash的概念,然后分享了使用方法示例,具有一定借鑒價(jià)值,需要的朋友可以了解下。2017-12-12

