海信|案例分析:记一次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好兄弟可以点赞并关注我 , 全部都是干货 。

    相关经验推荐