亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot統(tǒng)一返回格式的方法詳解

 更新時(shí)間:2022年08月31日 11:28:30   作者:指北君  
今天小編主要是和大家分享一個(gè)讓代碼變得更簡(jiǎn)潔的小技巧:統(tǒng)一返回格式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

前言

目前很多項(xiàng)目都是前后端分離,前后端會(huì)事先約定好返回格式。那么后端如何做,才能優(yōu)雅的返回統(tǒng)一格式呢,接下來(lái),請(qǐng)大家跟著我,一步步來(lái)實(shí)現(xiàn)。

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

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

@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. 約定返回格式

假如已經(jīng)與前端開(kāi)發(fā)妹子約定好了格式,比如:

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

那么我們首先需要編寫(xiě)一個(gè)封裝結(jié)果類(lèi)Result。為了方便封裝,在這個(gè)類(lèi)中增加一個(gè)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é)果對(duì)象
?????*
?????*?@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é)果

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

@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é)果完美符合格式。

但是這樣的代碼并不算簡(jiǎn)潔:每個(gè)接口的返回值都必須是Result<>,并且return的時(shí)候都要用Result.success()方法封裝一下。

那么,有沒(méi)有更優(yōu)雅的方法?我們繼續(xù)往下看:

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

編寫(xiě)注解

實(shí)際使用場(chǎng)景中,并不是所有接口都需要統(tǒng)一格式。我們這里使用一個(gè)注解作為開(kāi)關(guān),按需控制接口返回格式。

@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;
}

編寫(xiě)ControllerAdvice

@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);
????}

}

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

見(jiàn)證奇跡的時(shí)刻到了

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

這段代碼與最開(kāi)始一樣,并沒(méi)有返回Result,僅僅加上了@ApiResult注解,我們看返回結(jié)果:

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

大功告成!

以上只是最精簡(jiǎn)的例子,實(shí)際使用中還結(jié)合了 統(tǒng)一異常封裝、自定義返回格式 等功能。我們注意到@ApiResult注解中,有三個(gè)參數(shù):successCode、successMsg、resultClass,就是為了自定義返回格式預(yù)留的,下面再看兩個(gè)場(chǎng)景:

5. 自定義返回格式

場(chǎng)景1:返回成功時(shí)code為200

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

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

返回成功時(shí),結(jié)果中的code和msg都變?yōu)樵O(shè)置的值:

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

場(chǎng)景2:自定義返回格式

如果某個(gè)接口的返回格式不是默認(rèn)的返回格式,比如約定返回returnCode、returnDesc、data(對(duì)應(yīng)默認(rèn)的code、msg、data)。那么則需要新增一個(gè)返回結(jié)果類(lèi),比如ReturnResult:

@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é)果對(duì)象
?????*
?????*?@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;
}

這時(shí),返回結(jié)果就變?yōu)橄胍母袷搅耍?/p>

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

到此這篇關(guān)于SpringBoot統(tǒng)一返回格式的方法詳解的文章就介紹到這了,更多相關(guān)SpringBoot統(tǒng)一返回格式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot實(shí)現(xiàn)本地上傳文件到resources目錄

    SpringBoot實(shí)現(xiàn)本地上傳文件到resources目錄

    Java后端項(xiàng)目上傳文件是一個(gè)很常見(jiàn)的需求,這篇文章主要為大家介紹了SpringBoot如何實(shí)現(xiàn)本地上傳文件到resources目錄永久保存下載,需要的可以參考一下
    2023-07-07
  • SpringBoot如何對(duì)LocalDateTime進(jìn)行格式化并解析

    SpringBoot如何對(duì)LocalDateTime進(jìn)行格式化并解析

    這篇文章主要介紹了SpringBoot如何對(duì)LocalDateTime進(jìn)行格式化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 利用SpringMVC接收復(fù)雜對(duì)象和多個(gè)文件(前端使用JQuery)

    利用SpringMVC接收復(fù)雜對(duì)象和多個(gè)文件(前端使用JQuery)

    這篇文章主要介紹了利用SpringMVC接收復(fù)雜對(duì)象和多個(gè)文件(前端使用JQuery),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 關(guān)于BufferedReader的讀取效率問(wèn)題

    關(guān)于BufferedReader的讀取效率問(wèn)題

    這篇文章主要介紹了關(guān)于BufferedReader的讀取效率問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringMVC請(qǐng)求、響應(yīng)和攔截器的使用實(shí)例詳解

    SpringMVC請(qǐng)求、響應(yīng)和攔截器的使用實(shí)例詳解

    攔截器(Interceptor) 它是一個(gè)Spring組件,并由Spring容器管理,并不依賴Tomcat等容器,是可以單獨(dú)使用的,這篇文章給大家介紹SpringMVC請(qǐng)求、響應(yīng)和攔截器的使用,感興趣的朋友一起看看吧
    2024-03-03
  • MyBatis Plus 入門(mén)使用詳細(xì)教程

    MyBatis Plus 入門(mén)使用詳細(xì)教程

    這篇文章主要介紹了MyBatis Plus 入門(mén)使用詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java調(diào)用python的方法(jython)

    Java調(diào)用python的方法(jython)

    這篇文章主要介紹了Java調(diào)用python的方法(jython),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • 使用JavaSE來(lái)模擬斗地主

    使用JavaSE來(lái)模擬斗地主

    這篇文章主要介紹了使用JavaSE來(lái)模擬斗地主,對(duì)棋牌游戲有研究的同學(xué)可以參考一下
    2021-04-04
  • Spring?Data?JPA?在?@Query?中使用投影的方法示例詳解

    Spring?Data?JPA?在?@Query?中使用投影的方法示例詳解

    這篇文章主要介紹了Spring?Data?JPA?在?@Query?中使用投影的方法,大家需要注意如果要在 @Query 中使用投影,必須要主動(dòng)聲明要查詢的字段,并且主動(dòng)寫(xiě)明字段的別名才行,本文通過(guò)sql代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2022-07-07
  • Java聊天室之解決連接超時(shí)問(wèn)題

    Java聊天室之解決連接超時(shí)問(wèn)題

    這篇文章主要為大家詳細(xì)介紹了Java簡(jiǎn)易聊天室之解決連接超時(shí)問(wèn)題的方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以了解一下
    2022-10-10

最新評(píng)論