案例分析:記一次springMVC報詭異404的事故

引言
早上剛到公司,測試小伙伴就在群里瘋狂@我說:“小米,測試環(huán)境的訂單列表查不到數(shù)據(jù)了,昨天還是正常的,今天就突然沒有了”,我說:“別急,讓我看看先”……
定位問題
打開電腦,打開瀏覽器,打開網(wǎng)頁訪問測試環(huán)境的訂單列表,然后按“F12”,看下network,點(diǎn)了下功能,發(fā)現(xiàn)有“/store/storeInfo”接口報“404”錯誤,一般情況下,報404錯誤是因?yàn)闆]有創(chuàng)建該接口,但我搜索了代碼發(fā)現(xiàn)是一個2021年的老接口,應(yīng)該不存在404的問題。

包名+類名重復(fù)
想了想,測試小伙伴說的話中有一句很關(guān)鍵“昨天正常,今天突然沒有了”,我看了下git提交記錄,發(fā)現(xiàn)有一個小伙伴昨天剛提交了“StoreController”,這個類不在這個微服務(wù)中,但這個微服務(wù)會引用這個類所在的jar包,而且很巧的是包名一致,都是“com.xxx.store.StoreController”,我讓同事把這個類刪掉,把新增的方法放到原來的類中,重啟測試服務(wù),搞定。
源碼剖析

springMVC最核心的類是DispatcherServlet,在這個類的初始化的時候會調(diào)用“initHandlerMappings()”方法初始url和controller的映射關(guān)系。

在這里,我們發(fā)現(xiàn)matchingBeans有以下6個mapping,因?yàn)槲覀冊赾ontroller里一般都是以“RequestMapping”做映射,所以我們以該類去分析。
綁定url和controller關(guān)系

在這個類中有一個方法“registerHandlerMethod”是綁定url和controller類的關(guān)系,打斷點(diǎn)如下面4個圖所示,發(fā)現(xiàn)只有我們新創(chuàng)建的類而沒有原來的類,說明storeController被覆蓋了,至此真相大白。




建議
即使在不同的jar包下,包名+類名的組合不要重復(fù),以免出現(xiàn)類被覆蓋的情況。
END
好兄弟可以點(diǎn)贊并關(guān)注我的公眾號“javaAnswer”,全部都是干貨。
