封裝ResultVO實現統一返回結果

2021-10-10 19:18:23 字數 4098 閱讀 4866

為了在開發中,返回到前端的資料內容格式趨於一致,我們在開發過程中最好能夠將返回資料物件的格式進行約定,以便於開發對接過程中的約定速成;本章將帶你了解如何設計統一返回物件,以及與其相關的知識內容。

通過restful介面開發的介面,一般含有介面執行狀態(成功、失敗、失敗描述、成功的資料返回物件)

因此我們可以將返回結果物件結構定義如下如下:

@data

@allargsconstructor

@noargsconstructor

@apimodel(value = "統一請求的返回物件")

public class resultvo

定義了統一的的返回物件,那麼一般我們需要考慮不同場景的輸出和呼叫;比如成功,失敗,或其他異常等情況的便捷呼叫。如果是因為某種業務原因需要返回失敗操作,一般包含有錯誤碼和錯誤資訊,更有勝者包含對應的錯誤堆疊異常明細;那麼就需要我們對於錯誤碼做比較好的規劃和設計了;

這裡我們設計了如下的錯誤碼規劃,首先定義乙個ierrorcode(錯誤**的介面類),裡面定義兩個方法,即獲取錯誤碼和錯誤訊息的介面方法,如下

public inte***ce ierrorcode
定義了介面類,然後我們再定義errorcode的介面實現列舉;如下

public enum  errorcode implements ierrorcode 

@override

public integer getcode()

@override

public string getmsg()

}

做了如上定義,我們就可以在對應的方法中去進行使用了,使用過程中,我們可以直接 return resultvo;如下:

@restcontroller

@api(tags = "基礎模組介面")

public class indexctrl

}

從上面的**中我們可以看到,要做這樣的返回,貌似還是比較繁瑣,基本上要四行**才能有乙個完成的返回,並且errorcode類是固定的。

我們嘗試將上面**再做一次修改,希望達到如下效果:

需要達到如上兩點,我們首先修改resultvo類,豐富建構函式和支援列舉方法的傳值,**如下:

@data

@allargsconstructor

@noargsconstructor

@apimodel(value = "統一請求的返回物件")

public class resultvo

public resultvo(ierrorcode errorcode, t data)

public resultvo setcodemessage(ierrorcode codemessage)

}

完成如上,我們還可以封裝乙個工具類rv,方便使用:

public class rv 

/*** 失敗的返回物件

* @param: errcodeinte***ce

* @return: [resultvo]

***/

public static resultvo fail(ierrorcode errorcode)

/*** 描述: 通過errorcode和資料物件引數,構建乙個新的物件

* @param [errorcode, data]

* @return: [resultvo]

**/public static resultvo result(ierrorcode errorcode,object data)

}

還是以上面應用**為例,最終**修改如下

@restcontroller

@api(tags = "基礎模組介面")

public class indexctrl

}

前面我們描述了那麼多,這裡所謂的擴充套件性怎麼理解呢,這裡所謂的擴充套件性,更多是在不同業務系統,對於錯誤碼的定義的擴充套件,比如乙個我們專案裡面,分成了多個不同的模組,但每個模組的實現都依賴於基礎common包中封裝的工具;對於錯誤碼,我們不可能一次性在common中定義出所有模組的錯誤碼;因此我們在設計的時候,特意定義了ierrorcode介面庫類,預設由errorcode做了實現;

也就意味著,在common包中定義的這些類,沒有特殊情況不用高頻的修改,那我們在其他業務模組要定義自己的錯誤碼可以怎麼做呢。

如下,我們只需要在對應的業務模組,定義自己的錯誤碼列舉類即可,比如在裝置管理模組

/**

* new-retail

* * 錯誤碼定義範圍 10101-10200

* * @author hank

* @since 2020-11-21

*/public enum deviceerrorcode implements ierrorcode

@override

public integer getcode()

@override

public string getmsg()

}

在controller中的應用

我們根據裝置管理模組定義了對應的錯誤列舉類,也就意味著,在做該模組實際業務的時候,我們可以直接對外丟擲對應的錯誤碼,而不必考慮與其他模組的適配問題;其應用如下;

public resultvo restart(@requestbody deviceinfo deviceinfo)

return rv.success(deviceinfo);

}在異常中的應用

在前章節我們講到異常busines***ception的封裝,但是我們只是做了簡單的繼承runtimeexception而已,沒有繼續深入;那我們再結合本章所講到的錯誤**進行完善增強

/**

* new-retail-lesson

* * 自定義業務異常類

* * @author hank

* @since 2020-10-31

*/public class busines***ception extends runtimeexception

public busines***ception(ierrorcode errorcode)

public int getcode()

public string getdetailmessage()

}

從上面**中,我們可以看出,我們在busines***ception中增加了兩個變數code,detailmessage;並對建構函式做了多樣性處理,值得注意的是我們在建構函式中,增加了ierrorcode介面的引數;

既然在異常做了增強,那我們的異常攔截處也需要做響應的處理,找到我們前面定義的全域性異常類globalexceptionhander,在對應的攔截busines***ception處做對應的處理,如下

@restcontrolleradvice

public class globalexception

}

完成了上面的基礎工作,我們接下來看下在編碼中能夠如何使用;

在controller中有業務異常丟擲時,拿我們剛才的例子,**調整如下,不用直接return,可以直接丟擲對應的業務異常,由globalexceptionhander來兜底就行

public resultvo restart(@requestbody deviceinfo deviceinfo)

return rv.success(deviceinfo);

}在業務**中,可以直接丟擲對應的業務異常,最終由globalexception來兜底

當然在異常處理部分,我們可以根據場景需要,定義不同型別的異常,結構與上面類似,即可達到相同的效果

上面我們主要介紹了

resultvo物件的封裝

然後介紹了統一錯誤**介面類和錯誤列舉類的設計

以及結合resultvo物件和ierrorcode介面做了整合

通過ierrorcode與自定義異常結合再結合全域性異常攔截與resultvo物件結合做全域性異常攔截;

最後還介紹了結合定義的resultvo物件和ierrorcode介面類,可以如何做到異常方面的擴充套件。

02 統一結果封裝

這裡我們用到了乙個result的類,這個用於我們的非同步統一返回的結果封裝。一般來說,結果裡面有幾個要素必要的 所以可得到封裝如下 data public class result implements serializable public static result succ string me...

在flask restplus下統一介面返回格式

在使用flask flask restplus時,業務正常時介面函式返回乙個可以json序列化的物件 ns.route hello class hello resource def get self return hello hi 介面返回內容如下 hello hi 當業務異常 比如檢測到引數錯誤 ...

android Toast 可以統一取消封裝

toast統一管理類 public class toastutil 短時間顯示toast param context param message public static void showshort context context,charsequence message 短時間顯示toast ...