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

SpringBoot返回統(tǒng)一的JSON標(biāo)準(zhǔn)格式實(shí)現(xiàn)步驟

 更新時(shí)間:2021年08月14日 16:09:25   作者:pcdd  
這篇文章主要介紹了SpringBoot返回統(tǒng)一的JSON標(biāo)準(zhǔn)格式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

期望返回的JSON格式如下

{
  "code": 200,
  "msg": "操作成功",
  "data": "hello jenkins"
}

實(shí)現(xiàn)步驟如下

1.自定義狀態(tài)碼枚舉類。

@AllArgsConstructor
@Getter
public enum StatusCodeEnum {
    SC200(200, "操作成功"),
    SC999(999, "操作失敗"),
    SC401(401, "匿名用戶訪問(wèn)權(quán)限資源時(shí)的異常"),
    SC403(403, "無(wú)訪問(wèn)權(quán)限,請(qǐng)聯(lián)系管理員授予權(quán)限"),
    SC404(404, "請(qǐng)求的資源不存在"),
    SC500(500, "系統(tǒng)異常,請(qǐng)稍后重試"),
    // ...略
    private final Integer code;
    private final String msg;
}

2.封裝返回結(jié)果

@Data
public class ApiResult<T> implements Serializable {
    private Integer code;
    private String msg;
    private T data;

    public static <T> ApiResult<T> success(T data) {
        return ApiResult.success(StatusCodeEnum.SC200.getMsg(), data);
    }

    public static <T> ApiResult<T> success(String msg, T data) {
        ApiResult<T> apiResult = new ApiResult<>();
        apiResult.setCode(StatusCodeEnum.SC200.getCode());
        apiResult.setMsg(msg);
        apiResult.setData(data);
        return apiResult;
    }

    public static <T> ApiResult<T> fail(Integer code, String msg) {
        ApiResult<T> apiResult = new ApiResult<>();
        apiResult.setCode(code);
        apiResult.setMsg(msg);
        return apiResult;
    }

}

3.全局異常捕獲處理,使用@RestControllerAdvice注解。

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    /**
     * 捕獲其他異常
     */
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ExceptionHandler(Exception.class)
    public ApiResult<String> handle(Exception e) {
        log.error("全局異常信息:{}", e.getMessage());
        return ApiResult.fail(StatusCodeEnum.SC500.getCode(), StatusCodeEnum.SC500.getMsg());
    }
}
注解 功能
@RestControllerAdvice RestController的增強(qiáng)類,可用于實(shí)現(xiàn)全局異常處理器
@ExceptionHandler 統(tǒng)一處理某一類異常,從而減少代碼重復(fù)率和復(fù)雜度,比如要獲取自定義異??梢訞ExceptionHandler(BusinessException.class)
@ResponseStatus 指定客戶端收到的http狀態(tài)碼

注:請(qǐng)求進(jìn)來(lái) 會(huì)按照 filter -> interceptor -> controllerAdvice -> aspect -> controller的順序調(diào)用,
404異常(NoHandlerFoundException)是無(wú)法通過(guò)這種方式捕獲的,因?yàn)樵贔ilter層發(fā)生的異常都會(huì)到Spring默認(rèn)的異常處理。如果你在配置文件配置了server.error.path的話,就會(huì)使用你配置的異常處理地址,如果沒(méi)有就會(huì)使用你配置的error.path路徑地址,如果還是沒(méi)有,默認(rèn)使用/error來(lái)作為發(fā)生異常的處理地址。如果想要替換默認(rèn)的非Controller異常處理直接實(shí)現(xiàn)Spring提供的ErrorController接口就行了。

4.攔截Controller方法的返回值,統(tǒng)一處理返回值/響應(yīng)體,因?yàn)槲覀兒竺婷繉懸粋€(gè)接口都需要調(diào)用ApiResult.success()這行代碼對(duì)結(jié)果進(jìn)行包裝,重復(fù)勞動(dòng),浪費(fèi)體力,我們只需要實(shí)現(xiàn)SpringBoot提供的ResponseBodyAdvice接口即可。

@RestControllerAdvice
public class ApiResultWrapper implements ResponseBodyAdvice<Object> {
    /**
     * 是否支持advice功能
     */
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        return true;
    }

    /**
     * 對(duì)返回的數(shù)據(jù)進(jìn)行處理
     */
    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        if (o instanceof String) {
            return JSON.toJSONString(ApiResult.success(o));
        }
        // 這個(gè)判斷的作用:防止全局異常處理后返回的結(jié)果(類型為ApiResult)再次被包裝
        if (o instanceof ApiResult) {
            return o;
        }
        return ApiResult.success(o);
    }

}

5.創(chuàng)建Controller,定義兩個(gè)方法,讓第二個(gè)方法拋異常

@RestController
public class TestController {
    @GetMapping("/test1")
    public String test1() {
        return "當(dāng)前時(shí)間:" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }

    @GetMapping("/test2")
    public Integer test2() {
        System.out.println(1 / 0);
        return Integer.MAX_VALUE;
    }
}

6.分別請(qǐng)求http://localhost:8080/test1、http://localhost:8080/test2,結(jié)果如下

在這里插入圖片描述在這里插入圖片描述

在全局異常處理類中寫了一行代碼

log.error("全局異常信息:{}", e.getMessage());

所以調(diào)用test2方法時(shí)控制臺(tái)打印異常信息如下

在這里插入圖片描述

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

相關(guān)文章

  • Spring中實(shí)例化bean的四種方式詳解

    Spring中實(shí)例化bean的四種方式詳解

    這篇文章主要給大家介紹了關(guān)于Spring中實(shí)例化bean的四種方式,分別是setter 方法、構(gòu)造函數(shù)、靜態(tài)工廠以及實(shí)例工廠等四種方法,分別給出了示例代碼供大家參考學(xué)習(xí),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • Java split()方法中的特殊符號(hào)舉例詳解

    Java split()方法中的特殊符號(hào)舉例詳解

    Java中的split方法可以將一個(gè)字符串按照指定的分隔符進(jìn)行分割,返回一個(gè)字符串?dāng)?shù)組,這篇文章主要給大家介紹了關(guān)于Java split()方法中的特殊符號(hào)的相關(guān)資料,需要的朋友可以參考下
    2023-07-07
  • Java rmi遠(yuǎn)程方法調(diào)用基本用法解析

    Java rmi遠(yuǎn)程方法調(diào)用基本用法解析

    這篇文章主要介紹了Java rmi遠(yuǎn)程方法調(diào)用基本用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Java如何在PDF中添加ToolTip工具提示

    Java如何在PDF中添加ToolTip工具提示

    大家好,本篇文章主要講的是Java如何在PDF中添加ToolTip工具提示,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • Java使用設(shè)計(jì)模式中迭代器模式構(gòu)建項(xiàng)目的代碼結(jié)構(gòu)示例

    Java使用設(shè)計(jì)模式中迭代器模式構(gòu)建項(xiàng)目的代碼結(jié)構(gòu)示例

    這篇文章主要介紹了Java使用設(shè)計(jì)模式中迭代器模式構(gòu)建項(xiàng)目的代碼結(jié)構(gòu)示例,迭代器模式能夠?qū)υL問(wèn)者隱藏對(duì)象的內(nèi)部細(xì)節(jié),需要的朋友可以參考下
    2016-05-05
  • mybatis-plus在yml中配置詳解

    mybatis-plus在yml中配置詳解

    本文主要介紹了mybatis-plus在yml中配置詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • spring aop之@AfterReturning不生效問(wèn)題及解決

    spring aop之@AfterReturning不生效問(wèn)題及解決

    這篇文章主要介紹了spring aop之@AfterReturning不生效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • SpringBoot定時(shí)任務(wù)設(shè)計(jì)之時(shí)間輪案例原理詳解

    SpringBoot定時(shí)任務(wù)設(shè)計(jì)之時(shí)間輪案例原理詳解

    這篇文章主要為大家介紹了SpringBoot定時(shí)任務(wù)設(shè)計(jì)之時(shí)間輪案例原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Java中l(wèi)ambda表達(dá)式實(shí)現(xiàn)aop切面功能

    Java中l(wèi)ambda表達(dá)式實(shí)現(xiàn)aop切面功能

    本文主要介紹了Java中l(wèi)ambda表達(dá)式實(shí)現(xiàn)aop切面功能,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Jackson多態(tài)序列化圖文詳解

    Jackson多態(tài)序列化圖文詳解

    jackson允許配置多態(tài)類型處理,當(dāng)進(jìn)行反序列話時(shí),JSON數(shù)據(jù)匹配的對(duì)象可能有多個(gè)子類型,為了正確的讀取對(duì)象的類型,我們需要添加一些類型信息,下面這篇文章主要給大家介紹了關(guān)于Jackson多態(tài)序列化的相關(guān)資料,需要的朋友可以參考下
    2022-06-06

最新評(píng)論