欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

SpringBoot統(tǒng)一接口返回及全局異常怎么處理

今天小編給大家分享一下SpringBoot統(tǒng)一接口返回及全局異常怎么處理的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

網(wǎng)站制作、建網(wǎng)站找專業(yè)的建站公司成都創(chuàng)新互聯(lián):定制網(wǎng)站、模板網(wǎng)站、仿站、小程序制作、軟件開發(fā)、app軟件定制開發(fā)等。做網(wǎng)站價(jià)格咨詢成都創(chuàng)新互聯(lián):服務(wù)完善、10余年建站、值得信賴!網(wǎng)站制作電話:13518219792

一、SpringBoot不使用統(tǒng)一返回格式

默認(rèn)情況下,SpringBoot會(huì)有如下三種返回情況。

1.1 使用字符串返回
@GetMapping("/getUserName")
public String getUserName(){
    return "HuaGe";
}

調(diào)用接口返回結(jié)果:

HuaGe
1.2 使用實(shí)體類返回
@GetMapping("/getUserName")
public User getUserName(){
    return new User("HuaGe",18,"男");
}

調(diào)用接口返回結(jié)果:

{
  "name": "HuaGe",
  "age": "18",
  "性別": "男", 
}
1.3 異常情況下返回
@GetMapping("/getUserName")
public static String getUserName(){
    HashMap hashMap = Maps.newHashMap();
    return hashMap.get(0).toString();
}

模擬一個(gè)空指針異常,在不做任何異常處理的情況下,可以看下SpringBoot的默認(rèn)返回結(jié)果:

{
    "timestamp": "2021-08-09T06:56:41.524+00:00",
    "status": 500,
    "error": "Internal Server Error",
    "path": "/sysUser/getUserName"
}

對(duì)于上面這幾種情況,如果整個(gè)項(xiàng)目沒有定義統(tǒng)一的返回格式,五個(gè)后臺(tái)開發(fā)人員定義五種返回格式,這樣不僅代碼臃腫,前后端對(duì)接效率低,而且還會(huì)有一些意向不到的情況發(fā)生,比如前端直接顯示異常詳情等,這給用戶的體驗(yàn)是非常差的。

二、基礎(chǔ)玩法

項(xiàng)目中最常見到的是封裝一個(gè)工具類,類中定義需要返回的字段信息,把需要返回前端的接口信息,通過該類進(jìn)行封裝,這樣就可以解決返回格式不統(tǒng)一的現(xiàn)象了。

2.1 參數(shù)說明
  • code:狀態(tài)碼,后臺(tái)可以維護(hù)一套統(tǒng)一的狀態(tài)碼;

  • message:描述信息,接口調(diào)用成功/失敗的提示信息;

  • data:返回?cái)?shù)據(jù)。

2.2 流程說明
  • 新建Result類

public class Result<T> {
    
    private int code;
    
    private String message;
    
    private T data;

    public Result() {}
    public Result(int code, String message) {
        this.code = code;
        this.message = message;
    }
    
    /**
     * 成功
     */
    public static <T> Result<T> success(T data) {
        Result<T> result = new Result<T>();
        result.setCode(ResultMsgEnum.SUCCESS.getCode());
        result.setMessage(ResultMsgEnum.SUCCESS.getMessage());
        result.setData(data);
        return result;
    }

    /**
     * 失敗
     */
    public static <T> Result<T> error(int code, String message) {
        return new Result(code, message);
    }
}

定義返回狀態(tài)碼

public enum ResultMsgEnum {
    SUCCESS(0, "成功"),
    FAIL(-1, "失敗"),
    AUTH_ERROR(502, "授權(quán)失敗!"),
    SERVER_BUSY(503, "服務(wù)器正忙,請(qǐng)稍后再試!"),
    DATABASE_OPERATION_FAILED(504, "數(shù)據(jù)庫操作失敗");
    private int code;
    private String message;

    ResultMsgEnum(int code, String message) {
        this.code = code;
        this.message = message;
    }
    public int getCode() {
        return this.code;
    }
    
    public String getMessage() {
        return this.message;
    }
}
  • 使用方式

上面兩步定義了數(shù)據(jù)返回格式狀態(tài)碼,接下來就要看下在接口中如何使用了。

@GetMapping("/getUserName")
public Result getUserName(){
 &nbsp; &nbsp;return Result.success("huage");
}

調(diào)用結(jié)果如下,可以看到是我們?cè)赗esult中定義的參數(shù)類型。

{
 &nbsp; &nbsp;"code": 0,
 &nbsp; &nbsp;"message": "成功",
 &nbsp; &nbsp;"data": "huage"
}

這樣寫雖然能夠滿足日常需求,而且我相信很多小伙伴也是這么用的,但是如果我們有大量的接口,然后在每一個(gè)接口中都使用Result.success來包裝返回信息,會(huì)新增很多重復(fù)代碼,顯得不夠優(yōu)雅,甚至都不好意思拿出去顯擺。 肯定會(huì)有一種方式能夠再一次提高代碼逼格,實(shí)現(xiàn)最優(yōu)解。

三、進(jìn)階用法

基本用法學(xué)會(huì)后,接下來看點(diǎn)究極版本,主要用到如下兩個(gè)知識(shí)點(diǎn),用法簡單,無論是拿出來教學(xué)妹,還是指點(diǎn)小姐姐,都是必備技能。

3.1 類介紹
  • ResponseBodyAdvice:該接口是SpringMVC 4.1提供的,它允許在 執(zhí)行 @ResponseBody后自定義返回?cái)?shù)據(jù),用來封裝統(tǒng)一數(shù)據(jù)格式返回;

  • @RestControllerAdvice:該注解是對(duì)Controller進(jìn)行增強(qiáng)的,可以全局捕獲拋出的異常。

3.2 用法說明
  • 新建ResponseAdvice類;

  • 實(shí)現(xiàn)ResponseBodyAdvice接口,實(shí)現(xiàn)supports、beforeBodyWrite方法;

  • 該類用于統(tǒng)一封裝controller中接口的返回結(jié)果。

@RestControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice<Object> {
    @Autowired
    private ObjectMapper objectMapper;

    /**
     * 是否開啟功能 true:是 
     */
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        return true;
    }

    /**
     * 處理返回結(jié)果
     */
    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        //處理字符串類型數(shù)據(jù)
        if(o instanceof String){
            try {
                return objectMapper.writeValueAsString(Result.success(o));
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }
        return Result.success(o);
    }
}

我們可以通過getUserName接口測(cè)試一下,會(huì)發(fā)現(xiàn)和直接使用Result返回的結(jié)果是一致的。

不過,細(xì)心的小伙伴們肯定注意到了,在ResponseAdvice我們?nèi)渴褂昧?code>Result.success(o)來處理結(jié)果,對(duì)于error類型的結(jié)果未做處理。我們來看下,發(fā)生異常情況時(shí),返回結(jié)果是什么樣呢?繼續(xù)使用上面HashMap空指針異常的代碼,測(cè)試結(jié)果如下:

{
    "code": 0,
    "message": "成功",
    "data": {
        "timestamp": "2021-08-09T09:33:26.805+00:00",
        "status": 405,
        "error": "Method Not Allowed",
        "path": "/sysUser/getUserName"
    }
}

雖然格式上沒有毛病,但是在code、data字段的具體數(shù)據(jù)上是不友好或不正確的。不處理好這些事情,會(huì)嚴(yán)重影響自己在前端妹妹心中的高大形象的,這是決不能容忍的。

3.3 全局異常處理器

以前我們遇到異常時(shí),第一時(shí)間想到的應(yīng)該是try..catch..finnal吧,不過這種方式會(huì)導(dǎo)致大量代碼重復(fù),維護(hù)困難,邏輯臃腫等問題,這不是我們想要的結(jié)果。

今天我們要用的全局異常處理方式,用起來是比較簡單的。首先新增一個(gè)類,增加@RestControllerAdvice注解,該注解的作用花哥上面已經(jīng)介紹過,就不再嘮叨了。

@RestControllerAdvice
public class CustomerExceptionHandler {
 &nbsp; &nbsp;
}

如果我們有想要攔截的異常類型,就新增一個(gè)方法,使用@ExceptionHandler注解修飾,注解參數(shù)為目標(biāo)異常類型。

例如:controller中接口發(fā)生Exception異常時(shí),就會(huì)進(jìn)入到Execption方法中進(jìn)行捕獲,將雜亂的異常信息,轉(zhuǎn)換成指定格式后交給ResponseAdvice方法進(jìn)行統(tǒng)一格式封裝并返回給前端小伙伴。

@RestControllerAdvice
@Slf4j
public class CustomerExceptionHandler {

    @ExceptionHandler(AuthException.class)
    public String ErrorHandler(AuthorizationException e) {
        log.error("沒有通過權(quán)限驗(yàn)證!", e);
        return "沒有通過權(quán)限驗(yàn)證!";
    }

    @ExceptionHandler(Exception.class)
    public Result Execption(Exception e) {
        log.error("未知異常!", e);
        return Result.error(ResultMsgEnum.SERVER_BUSY.getCode(),ResultMsgEnum.SERVER_BUSY.getMessage());
    }
}

再次調(diào)用接口getUserName查看返回結(jié)果,會(huì)發(fā)現(xiàn)還是有一些問題,因?yàn)槲覀冊(cè)?code>CustomerExceptionHandler中已經(jīng)將接口返回結(jié)果封裝成Result類型,而代碼執(zhí)行到統(tǒng)一結(jié)果返回類ResponseAdvice時(shí),又會(huì)結(jié)果再次封裝,就出現(xiàn)了如下問題。

{
    "code": 0,
    "message": "成功",
    "data": {
        "code": 503,
        "message": "服務(wù)器正忙,請(qǐng)稍后再試!",
        "data": null
    }
}
3.4 統(tǒng)一返回結(jié)果處理類最終版

解決上述問題非常簡單,只要在beforeBodyWrite中增加一條判斷即可。

@RestControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice<Object> {
    @Autowired
    private ObjectMapper objectMapper;

    /**
     * 是否開啟功能 true:開啟
     */
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        return true;
    }

    /**
     * 處理返回結(jié)果
     */
    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        //處理字符串類型數(shù)據(jù)
        if(o instanceof String){
            try {
                return objectMapper.writeValueAsString(Result.success(o));
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }
        //返回類型是否已經(jīng)封裝
        if(o instanceof Result){
            return o;
        }
        return Result.success(o);
    }
}

以上就是“SpringBoot統(tǒng)一接口返回及全局異常怎么處理”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

文章標(biāo)題:SpringBoot統(tǒng)一接口返回及全局異常怎么處理
標(biāo)題URL:http://aaarwkj.com/article6/iijiig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)企業(yè)建站、定制開發(fā)服務(wù)器托管、商城網(wǎng)站App設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)
韩国av毛片在线播放| 91国内偷拍富婆国内精品对白| 99精品午夜福利在线| 手机蜜臀av在线播放| 91在线观看高清免费| 97福利影院在线观看| 亚洲一区欧美日韩91| 国产精品成久久久久三级| 国产精品人成在线观看不卡| 一本色道久久亚洲综合精品蜜桃 | 亚洲日本va午夜中文字幕一区| 亚洲国模av一区二区三区| 久久亚洲综合色一区二区三区| 九九热精品只有这里有| 91免费视频精品麻豆| 久久国产精品亚洲看片| 18禁超污网站免费观看| 国产av超爽剧情系列| 国产一级二级三级亚洲| 亚洲国产精品成人久久66| 亚洲综合偷拍欧美一区色| 亚洲乱人伦一区二区三区| 成年人性生活一级视品| 日韩视频精品一区二区| 精品人妻一区二区三区久久91 | 免费看真人性生活视频 | 欧美福利在线观看视频| 精品国产亚洲av剧情| 手机在线观看av大片| 全国最大成人免费视频| 国产日本韩国三级在线| 欧美精品日本一区二区| 日韩欧美中文字幕在线等| 日韩人妻精品在线一区二区| 夫妻过性生活视频播放| 熟女人妻av五十路六十路| 亚洲人午夜射精精品日韩| 日本国产一区二区在线观看| 97久久久人妻精品一区| 伊人久久亚洲精品综合| 欧美日韩国产精品高清|