只需一步了赌,在Spring Boot中統(tǒng)一Restful API返回值格式與統(tǒng)一處理異常

統(tǒng)一返回值

在前后端分離大行其道的今天墨榄,有一個(gè)統(tǒng)一的返回值格式不僅能使我們的接口看起來更漂亮,而且還可以使前端可以統(tǒng)一處理很多東西勿她,避免很多問題的產(chǎn)生袄秩。

比較通用的返回值格式如下:

public class Result<T> {
    // 接口調(diào)用成功或者失敗
    private Integer code = 0;
    // 失敗的具體code
    private String errorCode = "";
    // 需要傳遞的信息,例如錯(cuò)誤信息
    private String msg;
    // 需要傳遞的數(shù)據(jù)
    private T data;
    ...
}

最原始的接口如下:

    @GetMapping("/test")
    public User test() {
        return new User();
    }

當(dāng)我們需要統(tǒng)一返回值時(shí)逢并,可能會(huì)使用這樣一個(gè)辦法:

    @GetMapping("/test")
    public Result test() {
        return Result.success(new User());
    }

這個(gè)方法確實(shí)達(dá)到了統(tǒng)一接口返回值的目的之剧,但是卻有幾個(gè)新問題誕生了:

  • 接口返回值不明顯,不能一眼看出來該接口的返回值砍聊。
  • 每一個(gè)接口都需要增加額外的代碼量背稼。

所幸Spring Boot已經(jīng)為我們提供了更好的解決辦法,只需要在項(xiàng)目中加上以下代碼玻蝌,就可以無感知的為我們統(tǒng)一全局返回值蟹肘。

/**
 * 全局返回值統(tǒng)一封裝
 */
@EnableWebMvc
@Configuration
public class GlobalReturnConfig {

    @RestControllerAdvice
    static class ResultResponseAdvice implements ResponseBodyAdvice<Object> {
        @Override
        public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
            return true;
        }

        @Override
        public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
            if (body instanceof Result) {
                return body;
            }
            return new Result(body);
        }
    }
}

而我們的接口只需要寫成最原始的樣子就行了词疼。

    @GetMapping("/test")
    public User test() {
        return new User();
    }

統(tǒng)一處理異常

將返回值統(tǒng)一封裝時(shí)我們沒有考慮當(dāng)接口拋出異常的情況。當(dāng)接口拋出異常時(shí)讓用戶直接看到服務(wù)端的異沉备梗肯定是不夠友好的贰盗,而我們也不可能每一個(gè)接口都去try/catch進(jìn)行處理,此時(shí)只需要使用@ExceptionHandler注解即可無感知的全局統(tǒng)一處理異常阳欲。

@RestControllerAdvice
public class GlobalExceptionHandler {

    private static final Logger LOG = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    /**
     * 全局異常處理
     */
    @ExceptionHandler
    public JsonData handleException(HttpServletRequest request, HttpServletResponse response, final Exception e) {
        LOG.error(e.getMessage(), e);
        if (e instanceof AlertException) {//可以在前端Alert的異常
            if (((AlertException) e).getRetCode() != null) {//預(yù)定義異常
                return new Result(((AlertException) e).getRetCode());
            } else {
                return new Result(1, e.getMessage() != null ? e.getMessage() : "");
            }
        } else {//其它異常
            if (Util.isProduct()) {//如果是正式環(huán)境舵盈,統(tǒng)一提示
                return new Result(RetCode.ERROR);
            } else {//測試環(huán)境,alert異常信息
                return new Result(1, StringUtils.isNotBlank(e.getMessage()) ? e.getMessage() : e.toString());
            }
        }
    }

}

其中的AlertException為我們自定義的異常球化,因此當(dāng)業(yè)務(wù)中需要拋出錯(cuò)誤時(shí)秽晚,可以手動(dòng)拋出AlertException

以上就是統(tǒng)一處理返回值和統(tǒng)一處理異常的兩步筒愚。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爆惧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子锨能,更是在濱河造成了極大的恐慌,老刑警劉巖芍耘,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件址遇,死亡現(xiàn)場離奇詭異,居然都是意外死亡斋竞,警方通過查閱死者的電腦和手機(jī)倔约,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坝初,“玉大人浸剩,你說我怎么就攤上這事■郏” “怎么了绢要?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拗小。 經(jīng)常有香客問我重罪,道長,這世上最難降的妖魔是什么哀九? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任剿配,我火速辦了婚禮,結(jié)果婚禮上阅束,老公的妹妹穿的比我還像新娘呼胚。我一直安慰自己,他們只是感情好息裸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布蝇更。 她就那樣靜靜地躺著沪编,像睡著了一般。 火紅的嫁衣襯著肌膚如雪簿寂。 梳的紋絲不亂的頭發(fā)上漾抬,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機(jī)與錄音常遂,去河邊找鬼纳令。 笑死,一個(gè)胖子當(dāng)著我的面吹牛克胳,可吹牛的內(nèi)容都是我干的平绩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼漠另,長吁一口氣:“原來是場噩夢啊……” “哼捏雌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起笆搓,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤性湿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后满败,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肤频,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年算墨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宵荒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡净嘀,死狀恐怖报咳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挖藏,我是刑警寧澤暑刃,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站膜眠,受9級特大地震影響稍走,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜柴底,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一婿脸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柄驻,春花似錦狐树、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涯曲。三九已至,卻和暖如春在塔,著一層夾襖步出監(jiān)牢的瞬間幻件,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工蛔溃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绰沥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓贺待,卻偏偏與公主長得像徽曲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子麸塞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容