大家好,欢迎来到IT知识分享网。
引言
早上刚到公司,测试小伙伴就在群里疯狂@我说:“小米,测试环境的订单列表查不到数据了,昨天还是正常的,今天就突然没有了”,我说:“别急,让我看看先”……
定位问题
打开电脑,打开浏览器,打开网页访问测试环境的订单列表,然后按“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”,全部都是干货。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/163831.html