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

SpringBoot統(tǒng)一響應(yīng)格式及統(tǒng)一異常處理

 更新時間:2023年05月11日 09:24:25   作者:JK凱  
在我們開發(fā)SpringBoot后端服務(wù)時,一般需要給前端統(tǒng)一響應(yīng)格式,本文主要介紹了SpringBoot統(tǒng)一響應(yīng)格式及統(tǒng)一異常處理

在我們開發(fā)SpringBoot后端服務(wù)時,一般需要給前端統(tǒng)一響應(yīng)格式,方便前端調(diào)試及配置錯誤提示等等。這篇文章講講實際工作中統(tǒng)一響應(yīng)格式及統(tǒng)一異常處理是如何做的。

一、統(tǒng)一響應(yīng)基礎(chǔ)類

在項目中對應(yīng)工具類或Vo層來創(chuàng)建我們的統(tǒng)一響應(yīng)類

image.png

ResponseResult:

import com.fasterxml.jackson.annotation.JsonInclude;
import com.zhang.enums.AppHttpCodeEnum;
import java.io.Serializable;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResponseResult<T> implements Serializable {
    private Integer code;
    private String msg;
    private T data;
    public ResponseResult() {
        this.code = AppHttpCodeEnum.SUCCESS.getCode();
        this.msg = AppHttpCodeEnum.SUCCESS.getMsg();
    }
    public ResponseResult(Integer code, T data) {
        this.code = code;
        this.data = data;
    }
    public ResponseResult(Integer code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
    public ResponseResult(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    public static ResponseResult errorResult(int code, String msg) {
        ResponseResult result = new ResponseResult();
        return result.error(code, msg);
    }
    public static ResponseResult okResult() {
        ResponseResult result = new ResponseResult();
        return result;
    }
    public static ResponseResult okResult(int code, String msg) {
        ResponseResult result = new ResponseResult();
        return result.ok(code, null, msg);
    }
    public static ResponseResult okResult(Object data) {
        ResponseResult result = setAppHttpCodeEnum(AppHttpCodeEnum.SUCCESS, AppHttpCodeEnum.SUCCESS.getMsg());
        if (data != null) {
            result.setData(data);
        }
        return result;
    }
    public static ResponseResult errorResult(AppHttpCodeEnum enums) {
        return setAppHttpCodeEnum(enums, enums.getMsg());
    }
    public static ResponseResult errorResult(AppHttpCodeEnum enums, String msg) {
        return setAppHttpCodeEnum(enums, msg);
    }
    public static ResponseResult setAppHttpCodeEnum(AppHttpCodeEnum enums) {
        return okResult(enums.getCode(), enums.getMsg());
    }
    private static ResponseResult setAppHttpCodeEnum(AppHttpCodeEnum enums, String msg) {
        return okResult(enums.getCode(), msg);
    }
    public ResponseResult<?> error(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
        return this;
    }
    public ResponseResult<?> ok(Integer code, T data) {
        this.code = code;
        this.data = data;
        return this;
    }
    public ResponseResult<?> ok(Integer code, T data, String msg) {
        this.code = code;
        this.data = data;
        this.msg = msg;
        return this;
    }
    public ResponseResult<?> ok(T data) {
        this.data = data;
        return this;
    }
    public Integer getCode() {
        return code;
    }
    public void setCode(Integer code) {
        this.code = code;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public T getData() {
        return data;
    }
    public void setData(T data) {
        this.data = data;
    }
}

里面還有用到一個響應(yīng)的枚舉類AppHttpCodeEnum,接下來我們創(chuàng)建這個枚舉類

二、響應(yīng)枚舉類

image.png

AppHttpCodeEnum:

public enum AppHttpCodeEnum {
    // 成功
    SUCCESS(200, "操作成功"),
    // 登錄
    NEED_LOGIN(401, "需要登錄后操作"),
    NO_OPERATOR_AUTH(403, "無權(quán)限操作"),
    SYSTEM_ERROR(500, "出現(xiàn)錯誤"),
    USERNAME_EXIST(501, "用戶名已存在"),
    PHONENUMBER_EXIST(502, "手機號已存在"), EMAIL_EXIST(503, "郵箱已存在"),
    REQUIRE_USERNAME(504, "必需填寫用戶名"),
    CONTENT_NOT_NULL(506, "評論內(nèi)容不能為空"),
    FILE_TYPE_ERROR(507, "文件類型錯誤"),
    USERNAME_NOT_NULL(508, "用戶名不能為空"),
    NICKNAME_NOT_NULL(509, "昵稱不能為空"),
    PASSWORD_NOT_NULL(510, "密碼不能為空"),
    EMAIL_NOT_NULL(511, "郵箱不能為空"),
    NICKNAME_EXIST(512, "昵稱已存在"),
    LOGIN_ERROR(505, "用戶名或密碼錯誤");
    int code;
    String msg;
    AppHttpCodeEnum(int code, String errorMessage) {
        this.code = code;
        this.msg = errorMessage;
    }
    public int getCode() {
        return code;
    }
    public String getMsg() {
        return msg;
    }
}

一般我們在這個枚舉類中管理需要響應(yīng)的錯誤codemsg

三、統(tǒng)一響應(yīng)格式使用

在對應(yīng)的controller或者service里面使用統(tǒng)一響應(yīng)類

image.png

  • 成功: ResponseResult.okResult()
  • 失敗: ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR), 參數(shù)傳入我們定義的響應(yīng)枚舉類

四、統(tǒng)一異常處理

1. 自定義異常

為什么我們需要自定義異常?因為在某些情況下,我們需要返回我們自定義的響應(yīng)格式非常不方便,如在處理用戶鑒權(quán)或token校驗的時候,因為像這些部分我們一般都是在單獨的工具類中去處理,這時候如果報錯其實就可以拋出我們自定義的異常,交由我們?nèi)值漠惓L幚砣ソy(tǒng)一返回響應(yīng)。

  • exception包下新建SystemException
  • SystemException繼承RuntimeException

具體實現(xiàn)代碼如下

exception.SystemException:

import com.jk.enums.AppHttpCodeEnum;
public class SystemException extends RuntimeException{
    private int code;
    private String msg;
    public int getCode() {
        return code;
    }
    public String getMsg() {
        return msg;
    }
    public SystemException(AppHttpCodeEnum appHttpCodeEnum) {
        super(appHttpCodeEnum.getMsg());
        this.code = appHttpCodeEnum.getCode();
        this.msg = appHttpCodeEnum.getMsg();
    }
}

目前只是自定義了異常,我們還需要對自定義的異常進行處理,返回統(tǒng)一的響應(yīng)格式。

2.異常處理

  • handler.exception包下新建GlobalExceptionHandler處理類
  • @RestControllerAdvice是組合注解,由@ControllerAdvice、@ResponseBody組成,標(biāo)明是一個統(tǒng)一異常處理的類,并把返回結(jié)果封裝在ResponseBody
  • @Slf4jLombok實現(xiàn)日志輸出的注解
  • @ExceptionHandler標(biāo)明該方法處理哪些異常

具體代碼實現(xiàn)如下:

handler.exception.GlobalExceptionHandler:

import com.jk.enums.AppHttpCodeEnum;
import com.jk.exception.SystemException;
import com.jk.vo.ResponseResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
    @ExceptionHandler(SystemException.class)
    public ResponseResult systemExceptionHandler(SystemException e) {
        log.error("出現(xiàn)了異常! {}", e);
        return ResponseResult.errorResult(e.getCode(), e.getMsg());
    }
    @ExceptionHandler(Exception.class)
    public ResponseResult exceptionHandler(Exception e) {
        log.error("出現(xiàn)了異常! {}", e);
        return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR.getCode(), e.getMessage());
    }
}

可以看到我們除了處理自定義異常SystemException外,還對Exception就是其他我們無法預(yù)料到的異常做了一個兜底。

3.自定義異常使用

在需要拋出異常的地方:

throw new SystemException(AppHttpCodeEnum.LOGIN_ERROR);

前端接收到的響應(yīng)是:

{
    "code": 505,
    "msg": "用戶名或密碼錯誤"
}

這樣就比接收到500錯誤也不知道錯誤原因好多了。

到此這篇關(guān)于SpringBoot統(tǒng)一響應(yīng)格式及統(tǒng)一異常處理的文章就介紹到這了,更多相關(guān)SpringBoot統(tǒng)一響應(yīng)格式及異常處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis有查詢結(jié)果但存不進實體類的解決方案

    Mybatis有查詢結(jié)果但存不進實體類的解決方案

    這篇文章主要介紹了Mybatis有查詢結(jié)果但存不進實體類的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • MyBatisPlus的簡介及案例詳解

    MyBatisPlus的簡介及案例詳解

    MyBatisPlus(簡稱MP)是基于MyBatis框架基礎(chǔ)上開發(fā)的增強型工具,旨在簡化開發(fā)、提高效率。本文將為大家詳細(xì)介紹一下MyBatisPlus是使用,需要的可以參考一下
    2022-07-07
  • java實現(xiàn)計算器功能

    java實現(xiàn)計算器功能

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)計算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • java求兩個數(shù)中的大數(shù)(實例講解)

    java求兩個數(shù)中的大數(shù)(實例講解)

    下面小編就為大家?guī)硪黄猨ava求兩個數(shù)中的大數(shù)(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • springboot+feign+Hystrix整合(親測有效)

    springboot+feign+Hystrix整合(親測有效)

    本文主要介紹了springboot+feign+Hystrix整合,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • 淺析Spring基于注解的AOP

    淺析Spring基于注解的AOP

    Spring是一個廣泛應(yīng)用的框架,SpringAOP則是Spring提供的一個標(biāo)準(zhǔn)易用的aop框架,依托Spring的IOC容器,提供了極強的AOP擴展增強能力,對項目開發(fā)提供了極大地便利
    2022-11-11
  • mybatis-plus更新策略部分字段不更新問題

    mybatis-plus更新策略部分字段不更新問題

    這篇文章主要介紹了mybatis-plus更新策略部分字段不更新問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Springboot整合Swagger2后訪問swagger-ui.html 404報錯問題解決方案

    Springboot整合Swagger2后訪問swagger-ui.html 404報錯問題解決方案

    這篇文章主要介紹了Springboot整合Swagger2后訪問swagger-ui.html 404報錯,本文給大家分享兩種解決方案,結(jié)合實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • java base64編碼、解碼的三種方式總結(jié)

    java base64編碼、解碼的三種方式總結(jié)

    這篇文章主要介紹了java base64編碼、解碼的三種方式,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-10-10
  • 深入理解Java 類加載全過程

    深入理解Java 類加載全過程

    這篇文章主要介紹了深入理解Java 類加載全過程的相關(guān)資料,需要的朋友可以參考下
    2017-02-02

最新評論

宝应县| 玛沁县| 雷州市| 娄底市| 通江县| 镇江市| 洮南市| 康平县| 镇江市| 深水埗区| 新化县| 方城县| 蚌埠市| 宁德市| 文安县| 尉犁县| 仪陇县| 日照市| 宁陵县| 重庆市| 梁河县| 孝感市| 濉溪县| 揭东县| 和林格尔县| 无为县| 武宁县| 凤山市| 河源市| 环江| 高雄市| 弥勒县| 定西市| 板桥市| 兴宁市| 城口县| 常熟市| 报价| 略阳县| 嘉善县| 崇仁县|