最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot全局處理統(tǒng)一返回類(lèi)型方式

 更新時(shí)間:2023年07月21日 14:38:59   作者:Ray丿雷  
這篇文章主要介紹了SpringBoot全局處理統(tǒng)一返回類(lèi)型方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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è)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Postman實(shí)現(xiàn)傳List<String>集合

    Postman實(shí)現(xiàn)傳List<String>集合

    這篇文章主要介紹了Postman實(shí)現(xiàn)傳List<String>集合方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 使用Java程序化地在Excel工作表中應(yīng)用各種條件格式

    使用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ù)字簽名

    淺析java消息摘要與數(shù)字簽名

    這篇文章給大家分析了關(guān)于java消息摘要與數(shù)字簽名的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2018-08-08
  • 圖文講解Java中實(shí)現(xiàn)quickSort快速排序算法的方法

    圖文講解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)題

    這篇文章主要介紹了springboot定時(shí)任務(wù)@Scheduled執(zhí)行多次問(wèn)題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • mybatis執(zhí)行任意SQL問(wèn)題

    mybatis執(zhí)行任意SQL問(wèn)題

    文章主要介紹了使用MyBatis執(zhí)行任意SQL的方法,包括聲明接口、使用注解調(diào)用等步驟,并提到嘗試使用泛型進(jìn)行結(jié)果集處理時(shí)遇到的問(wèn)題,最后給出一種改進(jìn)后的解決方案
    2026-05-05
  • Java中的HashMap弱引用之WeakHashMap詳解

    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ù))

    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)單登錄功能

    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方法切割文件

    這篇文章主要介紹了Java編程實(shí)現(xiàn)用hash方法切割文件,簡(jiǎn)單介紹了hash的概念,然后分享了使用方法示例,具有一定借鑒價(jià)值,需要的朋友可以了解下。
    2017-12-12

最新評(píng)論

江源县| 景洪市| 林芝县| 株洲县| 乌拉特中旗| 安图县| 托里县| 万源市| 五家渠市| 西峡县| 莆田市| 双鸭山市| 凤翔县| 资阳市| 黄平县| 栾城县| 南丹县| 包头市| 梅州市| 青海省| 巴东县| 连平县| 南部县| 楚雄市| 嫩江县| 雅安市| 体育| 会宁县| 抚宁县| 武川县| 夏津县| 东乡| 临泉县| 永丰县| 上虞市| 辰溪县| 水城县| 宜州市| 芦溪县| 利津县| 彭泽县|