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

SpringBoot統(tǒng)一返回結(jié)果問題

 更新時間:2023年07月21日 14:31:27   作者:阿信爸  
這篇文章主要介紹了SpringBoot統(tǒng)一返回結(jié)果問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

目前很多項目都是前后端分離,前后端會事先約定好返回格式,前端如果使用axios的話,會在全局過濾器里進行校驗,那么后端如何做,才能優(yōu)雅的返回固定的統(tǒng)一格式呢,接下來我會帶著你一步步實現(xiàn)。

1. 直接返回結(jié)果

先看一下最基本的例子,直接將結(jié)果原封不動返回:

@Data
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class TestVo {
    private static final long serialVersionUID = 1L;
    @Schema(name = "姓名")
    private String name;
    @Schema(name = "年齡")
    private Integer age;
}
@RestController
@RequestMapping(value = "/test")
public class TestApi {
    @GetMapping("/simple")
    public TestVo simple() {
        TestVo testVo = new TestVo("張三", 30);
        return testVo;
    }
}

返回結(jié)果:

{
    "name": "張三",
    "age": 30
}

2. 約定返回格式

假如與前端開發(fā)妹子約定好了格式,比如:

{
    "code": 0,
    "msg": "錯誤信息",
    "data": 實際返回結(jié)果
}

那么我們首先需要編寫一個封裝結(jié)果類Result,為了方便封裝,我們再提供一個success方法:

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Result<T> implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 返回編碼
     */
    private Integer code;
    /**
     * 編碼描述
     */
    private String msg;
    /**
     * 業(yè)務(wù)數(shù)據(jù)
     */
    private T data;
    /**
     * 返回成功結(jié)果對象
     *
     * @param data
     * @param <T>
     * @return
     */
    public static <T> Result<T> success(T data) {
        Result result = new Result();
        result.setCode(0);
        result.setMsg("success");
        result.setData(data);
        return result;
    }
}

3. 返回統(tǒng)一格式結(jié)果

后臺接口代碼微調(diào)一下即可,返回值改為Result,泛型為原返回值的類型:

@RestController
@RequestMapping(value = "/test")
public class TestApi {
    @GetMapping("/withResult")
    public Result<TestVo> withResult() {
        TestVo testVo = new TestVo("張三", 30);
        return Result.success(testVo);
    }
}

返回結(jié)果:

{
    "code": 0,
    "msg": "success",
    "data": {
        "name": "張三",
        "age": 30
    }
}

至此,后端返回結(jié)果完美符合格式,但是每個接口的返回值都是Result<>,并且return的時候都要用success方法封裝一下,不夠優(yōu)雅,怎么辦?我們繼續(xù)看:

4. 切片封裝統(tǒng)一格式

編寫注解

實際使用場景中,并不是所有接口都能完美的統(tǒng)一格式,使用注解可以按需控制接口返回格式。

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ApiResult {
    String value() default "";
    int successCode() default 0;
    String successMsg() default "success";
    Class<? extends IResult> resultClass() default Result.class;
}

編寫ControllerAdvice

@Order(0)
@ControllerAdvice
public class MyResponseBodyAdvice implements ResponseBodyAdvice {
    protected boolean isStringConverter(Class converterType) {
        return converterType.equals(StringHttpMessageConverter.class);
    }
    protected boolean isApiResult(MethodParameter returnType) {
        return returnType.hasMethodAnnotation(ApiResult.class);
    }
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return !isStringConverter(converterType) && isApiResult(returnType);
    }
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
                                  Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        //關(guān)鍵                         
        return Result.success(body);
    }
}

這里有一點要注意,這個advice中supports方法中判斷返回結(jié)果類型必須為非String類型。如果返回結(jié)果為String類型,那么result要轉(zhuǎn)為json字符串后再返回,需要再寫一個advice。

接下來見證奇跡的時刻到了

@ApiResult
    @GetMapping("/withResultHide")
    public TestVo withResultHide() {
        TestVo testVo = new TestVo("張三", 30);
        return testVo;
    }

這段代碼與直接返回結(jié)果的一樣,僅僅加上了@ApiResult注解,我們看返回結(jié)果:

{
    "code": 0,
    "msg": "success",
    "data": {
        "name": "張三",
        "age": 30
    }
}

大功告成!

以上只是最精簡的例子,實際使用中還結(jié)合了 統(tǒng)一異常封裝、自定義返回格式 等功能。

我們注意到@ApiResult注解中,有三個參數(shù):successCode、successMsg、resultClass,就是為了自定義返回格式預(yù)留的,

下面看個例子:

5. 自定義返回格式

返回成功時code為200

如果個別接口的返回格式與默認(rèn)格式相同,但是要求code等于200代表成功,那么修改下successCode參數(shù)即可:

@ApiResult(successCode = 200, successMsg = "ok")
    @GetMapping("/withResultHide")
    public TestVo withResultHide() {
        TestVo testVo = new TestVo("張三", 30);
        return testVo;
    }

我們發(fā)現(xiàn),返回成功時,結(jié)果中的code和msg都變?yōu)樵O(shè)置的值:

{
    "code": 200,
    "msg": "ok",
    "data": {
        "name": "張三",
        "age": 30
    }
}

自定義返回格式

如果個別的接口返回格式不是默認(rèn)的返回格式,那么我們需要新增一個返回結(jié)果類,比如ReturnResult,里面包含returnCode、returnDesc、data三個屬性:

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ReturnResult<T> implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 返回編碼
     */
    private String returnCode;
    /**
     * 編碼描述
     */
    private String returnDesc;
    /**
     * 業(yè)務(wù)數(shù)據(jù)
     */
    private T data;
    /**
     * 返回成功結(jié)果對象
     *
     * @param data
     * @param <T>
     * @return
     */
    public static <T> ReturnResult<T> success(T data) {
        ReturnResult result = new ReturnResult();
        result.setReturnCode(0);
        result.setReturnDesc("success");
        result.setData(data);
        return result;
    }
}

然后修改接口上的@ApiResult注解中的resultClass屬性

@ApiResult(resultClass = ReturnResult.class)
    @GetMapping("/withResultHide")
    public TestVo withResultHide() {
        TestVo testVo = new TestVo("張三", 30);
        return testVo;
    }

這時,返回結(jié)果變?yōu)槿缦拢?/p>

{
    "returnCode": "0",
    "returnDesc": "success",
    "data": {
        "name": "張三",
        "age": 30
    }
}

注意:以上自定義返回結(jié)果的例子需要自行根據(jù)實際情況添加,文章中的例子并不能實現(xiàn)

總結(jié)

只要按照上面一步步改造,即可實現(xiàn)統(tǒng)一返回結(jié)果,既規(guī)范、又優(yōu)雅,也可根據(jù)自己所需添加對應(yīng)的屬性和數(shù)據(jù)。還等什么,搞起來吧~

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java編程利用socket多線程訪問服務(wù)器文件代碼示例

    Java編程利用socket多線程訪問服務(wù)器文件代碼示例

    這篇文章主要介紹了Java編程利用socket多線程訪問服務(wù)器文件代碼示例,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • mybatis注入Date日期值為null的解決方法

    mybatis注入Date日期值為null的解決方法

    這篇文章主要給大家介紹了關(guān)于mybatis注入Date日期值為null的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • SpringMVC實現(xiàn)自定義類型轉(zhuǎn)換器

    SpringMVC實現(xiàn)自定義類型轉(zhuǎn)換器

    本篇文章主要介紹了SpringMVC實現(xiàn)自定義類型轉(zhuǎn)換器 ,詳細(xì)的介紹了自定義類型轉(zhuǎn)換器的用法和好處,有興趣的可以了解一下。
    2017-04-04
  • java實現(xiàn)遍歷樹形菜單兩種實現(xiàn)代碼分享

    java實現(xiàn)遍歷樹形菜單兩種實現(xiàn)代碼分享

    這篇文章主要介紹了java實現(xiàn)遍歷樹形菜單兩種實現(xiàn)代碼分享,兩種實現(xiàn):OpenSessionView實現(xiàn)、TreeAction實現(xiàn)。具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java結(jié)構(gòu)型設(shè)計模式之享元模式示例詳解

    Java結(jié)構(gòu)型設(shè)計模式之享元模式示例詳解

    享元模式(FlyWeight?Pattern),也叫蠅量模式,運用共享技術(shù),有效的支持大量細(xì)粒度的對象,享元模式就是池技術(shù)的重要實現(xiàn)方式。本文將通過示例詳細(xì)講解享元模式,感興趣的可以了解一下
    2022-09-09
  • Java使用反射生成JDK代理示例

    Java使用反射生成JDK代理示例

    這篇文章主要介紹了Java使用反射生成JDK代理,結(jié)合實例形式分析了java基于反射實現(xiàn)jdk動態(tài)代理相關(guān)操作技巧,需要的朋友可以參考下
    2019-07-07
  • Java實現(xiàn)微信發(fā)紅包

    Java實現(xiàn)微信發(fā)紅包

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)微信發(fā)紅包,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Java 程序設(shè)計總復(fù)習(xí)題(java基礎(chǔ)代碼)

    Java 程序設(shè)計總復(fù)習(xí)題(java基礎(chǔ)代碼)

    這篇文章主要介紹了Java 程序設(shè)計總復(fù)習(xí)題,主要是java基礎(chǔ)代碼,方便學(xué)習(xí)java的同學(xué)
    2021-05-05
  • Java螺旋矩陣處理方法詳解

    Java螺旋矩陣處理方法詳解

    螺旋矩陣是指一個呈螺旋狀的矩陣,它的數(shù)字由第一行開始到右邊不斷變大,向下變大,向左變大,向上變大,如此循環(huán)。利用java實現(xiàn)的螺旋矩陣,當(dāng)輸入N之后,會自動打印出螺旋矩陣
    2022-09-09
  • JAVA解析XML字符串簡單方法代碼案例

    JAVA解析XML字符串簡單方法代碼案例

    這篇文章主要介紹了JAVA解析XML字符串簡單方法代碼案例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09

最新評論

县级市| 寿宁县| 双桥区| 清水河县| 宾阳县| 光山县| 通榆县| 皮山县| 云龙县| 兴和县| 新和县| 双辽市| 澳门| 长顺县| 凤凰县| 隆德县| 巨鹿县| 乌拉特中旗| 耒阳市| 贵南县| 湖北省| 龙海市| 宁都县| 兰考县| 于田县| 卓尼县| 广丰县| 武穴市| 正安县| 宜君县| 马尔康县| 北京市| 建水县| 上思县| 永城市| 宝应县| 绥德县| 天等县| 滦南县| 同心县| 镇江市|