SpringBoot項目通用返回值與全局異常處理(二)

SpringBoot項目通用返回值與全局異常處理 文中使用@RestControllerAdvice註解的MyExceptionHandler類完成對異常的統一處理。比如:在Controller中如果對入參校驗不通過時直接throw一個自定義異常,然後這個異常會被捕獲,會執行MyExceptionHandler類中的handleException()方法,打印日誌並組裝統一返回格式給調用者。視乎沒有什麼問題…

在微服務體系的項目中,多個服務協同完成工作,註冊中心,配置中心,網關,各業務模塊以及基礎服務等。基礎服務是的職責一般都是給各業務模塊提供基礎的查詢服務,少量的或者從不提供增加修改功能。假設一個服務其中一個接口提供的是查詢一個訂單編號是否有效,訂單編號不存時表示無效,返回一個Result並給出code和msg,而各個業務模塊在某一時間段會頻繁調用該接口,這時如果使用throw異常的方式就會導致該異常被框架頻繁try_catch。try_catch對程序性能影響是非常大的。

所以必須對基礎業務的返回異常方式修改

1 修改通用返回值實體類,增加靜態方法ok()和error()

public class Result<T> {
    private boolean success = true;
    private String errorCode = "0";
    private String errorMsg = null;
    private List<T> data = new ArrayList<>();

    public Result() {}
    public Result(List<T> data) {
        if (data != null && data.size() > 0) {
            this.data = data;
        }
    }
    public Result(T data) {
        this.data.add(data);
    }

    // 成功時
    public static Result ok() {
        return new Result();
    }

    public static Result ok(List data) {
        Result r = new Result();
        r.setData(data);
        return r;
    }

    // 異常時
    public static Result error(String code, String msg) {
        Result r = new Result();
        r.setSuccess(false);
        r.setErrorCode(code);
        r.setErrorMsg(msg);
        return r;
    }

    public static Result error(MyExceptionEnum myExceptionEnum) {
        return error(myExceptionEnum.getCode(), myExceptionEnum.getMsg());
    }
	// 省略getter、setter和tostring
}

2 controller中throw new Exception修改爲return Result.error()

    @RequestMapping(
            value = "test2",
            method = RequestMethod.POST)
    public Result<FrogTest> test2(@RequestBody FrogTest bean) {
        if (bean.getName() == null) {
            // 校驗失敗時
            return Result.error("A02", "名稱不能爲空");
            //throw new MyException("A02","名稱不能爲空");
        }
        // 執行業務成功時
        return new Result<>(bean);
    }

優化完畢!

一個成熟的項目必定時各個方面都是較完美的,比如擁有合理的架構,可維護性高的代碼,性能達標,運維成本低且簡單等。
作爲一個程序員中的菜雞或許不能站在很高的角度去考慮到方方面面,但是既然天天與代碼接觸,就必須爲自己的代碼負責。儘可能花時間的對我們自己的源代碼不斷的進行優化,而不只是考慮實現功能就完事。在性能優化方面我們需要通過不斷學習計算機相關知識、編程語言、框架以及工作經驗的積累才能完成,但是在源代碼優化方面是人人可以做到的。

使用簡練的註釋、合理的空格空行、方法的拆分都可以使代碼清晰美觀,更重要的是自己或者別人維護起來方便。除此之外,使用枚舉類、編寫工具類、設計模式使用、學習JDK新特性和思想等可以簡化代碼、使業務功能清晰劃分,同樣是爲了達成好維護的目標。

以上是一些個人體會。

一開始寫博客是爲了記錄一些學習內容和工作心得,因爲最早是記在文檔中後來電腦換來換去就丟失了不少,所以選擇在博客中記錄。一些學習教程和已經解決的問題網上有的就不在記錄了,定期彙總,自己遇到的問題覺得有價值的內容在放到博客上。

前些天朋友問我幾個技術框架知不知道,作爲一個菜雞,我很爭氣的告訴他沒聽過。網上各種技術框架層出不窮,感覺永遠都跟不上節奏,今天一個K8s明天一個K3s,雖然這樣多,學還是要學的,但是我覺得還是深度優先、廣度次之,經常用的比如spring系列還是要深入理解一下,如果目前還沒接觸到的框架等到用的時候再去學習。框架學習還是先會用再去看原理看底層。畢竟項目開發時可沒有時間等你研究幾個月研究明白了纔開發,需要的是能看着官方文檔就能快速上手的。

說到工作,我覺得以我個人情況來說,就靠着工作賺着幾毛錢養家餬口,所以工作態度還是很端正的,多做多思考,對自己也是一個鍛鍊。不論什麼時候認認真真,對人對事對自己都負責

以上是一些個人心得。

最後一句話,鹹魚也要有夢想,至少應該做到比其他鹹魚更鹹!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章