SpringBoot全局處理統(tǒng)一返回類型方式
SpringBoot全局處理統(tǒng)一返回類型
在日常開發(fā)中,我們會(huì)定義各種各樣的返回類型,不便于后期維護(hù),也不便于前臺(tái)進(jìn)行數(shù)據(jù)處理;有些項(xiàng)目會(huì)封裝一個(gè)統(tǒng)一的返回類型,讓開發(fā)人員用這個(gè)封裝類返回,但是隨著項(xiàng)目人員的變更,如果沒有統(tǒng)一的要求規(guī)范,后期也會(huì)變得不可控,而且代碼的耦合度也太高。
基于此場景,我們封裝了一個(gè)統(tǒng)一返回類型(響應(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)描述
}需要的依賴
首先添加需要的依賴
<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è)前端常用字段,還有一些初始化對(duì)象的方法。
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;
/**
* 請(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;
}
/**
* 無數(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)換會(huì)出問題
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è)試
寫一個(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ù)";
}
}瀏覽器訪問如下圖

測(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é)果問題
- 詳解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-05
Mybatis關(guān)聯(lián)查詢之一對(duì)多和多對(duì)一XML配置詳解
這篇文章主要介紹了Mybatis關(guān)聯(lián)查詢之一對(duì)多和多對(duì)一XML配置詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
java向下轉(zhuǎn)型基礎(chǔ)知識(shí)點(diǎn)及實(shí)例
在本篇文章里小編給大家整理的是一篇關(guān)于java向下轉(zhuǎn)型基礎(chǔ)知識(shí)點(diǎn)及實(shí)例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-05-05
Java分別利用深度優(yōu)先和廣度優(yōu)先求解迷宮路徑
這篇文章主要為大家詳細(xì)介紹了Java如何利用深度優(yōu)先的非遞歸遍歷方法和廣度優(yōu)先的遍歷方法實(shí)現(xiàn)求解迷宮路徑,文中的示例代碼講解詳細(xì),需要的可以參考一下2022-08-08
JAVA 根據(jù)設(shè)置的概率生成隨機(jī)數(shù)的方法
本篇文章主要介紹了JAVA 根據(jù)設(shè)置的概率生成隨機(jī)數(shù)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08
Java接口返回省市區(qū)樹形結(jié)構(gòu)的實(shí)現(xiàn)
本文主要介紹了Java接口返回省市區(qū)樹形結(jié)構(gòu)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01

