欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

相關(guān)文章

  • Java基于裝飾者模式實(shí)現(xià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)查詢之一對多和多對一XML配置詳解

    Mybatis關(guān)聯(lián)查詢之一對多和多對一XML配置詳解

    這篇文章主要介紹了Mybatis關(guān)聯(lián)查詢之一對多和多對一XML配置詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • java向下轉(zhuǎn)型基礎(chǔ)知識點(diǎn)及實(shí)例

    java向下轉(zhuǎn)型基礎(chǔ)知識點(diǎn)及實(shí)例

    在本篇文章里小編給大家整理的是一篇關(guān)于java向下轉(zhuǎn)型基礎(chǔ)知識點(diǎn)及實(shí)例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-05-05
  • 基于XML的Spring聲明事務(wù)控制

    基于XML的Spring聲明事務(wù)控制

    這篇文章主要為大家詳細(xì)介紹了基于XML的Spring聲明事務(wù)控制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Java分別利用深度優(yōu)先和廣度優(yōu)先求解迷宮路徑

    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ù)的方法

    本篇文章主要介紹了JAVA 根據(jù)設(shè)置的概率生成隨機(jī)數(shù)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • Go&java算法之最大數(shù)示例詳解

    Go&java算法之最大數(shù)示例詳解

    這篇文章主要為大家介紹了Go&java算法之最大數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Spring?boot?整合Logback過程示例解析

    Spring?boot?整合Logback過程示例解析

    這篇文章主要為大家介紹了Spring?boot?整合Logback的過程及示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Java接口返回省市區(qū)樹形結(jié)構(gòu)的實(shí)現(xiàn)

    Java接口返回省市區(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
  • Java中的多態(tài)用法實(shí)例分析

    Java中的多態(tài)用法實(shí)例分析

    這篇文章主要介紹了Java中的多態(tài)用法,較為詳細(xì)的分析了java中多態(tài)的概念與相關(guān)的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04

最新評論