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

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

文章圖片

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

文章圖片

【海信|案例分析:記一次springMVC報詭異404的事故】海信|案例分析:記一次springMVC報詭異404的事故

文章圖片

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

文章圖片

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


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

包名+類名重復想了想 , 測試小伙伴說的話中有一句很關鍵“昨天正常 , 今天突然沒有了” , 我看了下git提交記錄 , 發現有一個小伙伴昨天剛提交了“StoreController” , 這個類不在這個微服務中 , 但這個微服務會引用這個類所在的jar包 , 而且很巧的是包名一致 , 都是“com.xxx.store.StoreController” , 我讓同事把這個類刪掉 , 把新增的方法放到原來的類中 , 重啟測試服務 , 搞定 。
源碼剖析
springMVC最核心的類是DispatcherServlet , 在這個類的初始化的時候會調用“initHandlerMappings()”方法初始url和controller的映射關系 。

在這里 , 我們發現matchingBeans有以下6個mapping , 因為我們在controller里一般都是以“RequestMapping”做映射 , 所以我們以該類去分析 。
綁定url和controller關系
在這個類中有一個方法“registerHandlerMethod”是綁定url和controller類的關系 , 打斷點如下面4個圖所示 , 發現只有我們新創建的類而沒有原來的類 , 說明storeController被覆蓋了 , 至此真相大白 。




建議即使在不同的jar包下 , 包名+類名的組合不要重復 , 以免出現類被覆蓋的情況 。
END好兄弟可以點贊并關注我 , 全部都是干貨 。

    相關經驗推薦