欢迎光临散文网 会员登陆 & 注册

案例分析:记一次springMVC报诡异404的事故

2022-06-08 09:59 作者:做架构师不做框架师  | 我要投稿


引言

早上刚到公司,测试小伙伴就在群里疯狂@我说:“小米,测试环境的订单列表查不到数据了,昨天还是正常的,今天就突然没有了”,我说:“别急,让我看看先”……

定位问题

打开电脑,打开浏览器,打开网页访问测试环境的订单列表,然后按“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

好兄弟可以点赞并关注我的公众号“javaAnswer”,全部都是干货。




案例分析:记一次springMVC报诡异404的事故的评论 (共 条)

分享到微博请遵守国家法律