Spring的RequestBodyAdvice攔截淺析
背景
因?yàn)轫?xiàng)目接口需要進(jìn)行解密,需要對數(shù)據(jù)進(jìn)行統(tǒng)一處理,就使用了ReuqestBodyAdvice進(jìn)行數(shù)據(jù)解密處理,但是偶然的發(fā)現(xiàn)supports方法會(huì)出現(xiàn)執(zhí)行兩次的情況,覺得有點(diǎn)奇異就進(jìn)行了一次斷點(diǎn)調(diào)試,然后就發(fā)現(xiàn)了執(zhí)行兩次的原因;
過程
1.默認(rèn)supports方法返回false,表示不做任何處理:

2.默認(rèn)supports方法返回true,表示對數(shù)據(jù)進(jìn)行處理:

如圖所示無論supports方法返回true還是false,只要這個(gè)ReuqestAdvice存在并且在spring中生效,supports方法都會(huì)執(zhí)行兩次;
了解了前置情況接下來就是用斷點(diǎn)進(jìn)行接口調(diào)試了:
第一次跳過supports方法后的跳轉(zhuǎn):

第二次執(zhí)行完supports方法之后的跳轉(zhuǎn):

如圖所示,如果有經(jīng)常對看源碼或者眼尖的朋友應(yīng)該就會(huì)方法兩次執(zhí)行完supports方法之后跳轉(zhuǎn)的方法名是有區(qū)別的:
第一次執(zhí)行后跳轉(zhuǎn): beforeBodyRead
第二次執(zhí)行后跳轉(zhuǎn): afterBodyRead
結(jié)論
如上述的調(diào)測結(jié)果所示,實(shí)現(xiàn)RequestBodyAdvice接口之后的攔截在成功執(zhí)行的時(shí)候會(huì)調(diào)用兩次supports方法.
而執(zhí)行兩次的原因是因?yàn)樾枰謩e對beforeBodyRead和afterBodyRead進(jìn)行判斷:
當(dāng)?shù)谝淮蝧upports方法返回結(jié)果是true的時(shí)候表示會(huì)執(zhí)行beforeBodyRead方法
當(dāng)?shù)诙蝧upports方法返回true的時(shí)候表示會(huì)執(zhí)行afterBodyRead方法.
反之亦然
PS: 一個(gè)比較容易被人忽視但是找不到解決方法的小細(xì)節(jié):
若是Controller類上的方法參數(shù)沒有加上@RequestBody標(biāo)簽則該RequestBodyAdvice是不會(huì)被執(zhí)行的.
如果上述內(nèi)容存在問題,麻煩各位留言指出會(huì)第一時(shí)間修改.
到此這篇關(guān)于Spring的RequestBodyAdvice攔截淺析的文章就介紹到這了,更多相關(guān)Spring RequestBodyAdvice攔截內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)平鋪列表(List)互轉(zhuǎn)樹形(Tree)結(jié)構(gòu)
本文主要介紹了Java實(shí)現(xiàn)平鋪列表(List)互轉(zhuǎn)樹形(Tree)結(jié)構(gòu),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
解決MyBatis @param注解參數(shù)類型錯(cuò)誤異常的問題
這篇文章主要介紹了解決MyBatis @param注解參數(shù)類型錯(cuò)誤異常的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
關(guān)于Spring的統(tǒng)一功能處理(攔截器)實(shí)現(xiàn)
這篇文章主要介紹了關(guān)于Spring的統(tǒng)一功能處理(攔截器)實(shí)現(xiàn),每個(gè)方法中都要單獨(dú)寫用戶登錄驗(yàn)證的方法,即使封裝成公共方法,也一樣要傳參調(diào)用和在方法中進(jìn)行判斷,需要的朋友可以參考下2023-05-05
eclipse怎么引入spring boot項(xiàng)目插件的方法
這篇文章主要介紹了eclipse怎么引入spring boot項(xiàng)目插件的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
SpringBoot整合Mybatis與MybatisPlus方法詳細(xì)講解
這篇文章主要介紹了SpringBoot整合Mybatis與MybatisPlus方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01
SpringBoot實(shí)現(xiàn)文件斷點(diǎn)續(xù)傳功能詳解
在處理大文件傳輸或網(wǎng)絡(luò)不穩(wěn)定的情況下,文件斷點(diǎn)續(xù)傳功能顯得尤為重要,本文將詳細(xì)介紹如何使用Spring Boot實(shí)現(xiàn)文件的斷點(diǎn)續(xù)傳功能,需要的可以了解下2025-04-04

