springmvc 中关于配置相同url路径深度剖析

问题引入:生产环境查询推荐人列表信息查询不到(无任何报错信息,service中无日志打印,但是数据库中有相关数据)?

              排查发现,项目中存在两个相同的(查询推荐人列表信息)url路径!!!!!!!

为什么同一个项目中存在相同url路径,项目启动时候却不报错?
首先,根据常识,在写一个接口时候,我们会尽量避免不会出现与之前相同的url路径,想着就算出现了相同的url路径,在项目启动的时候会报错,从而我们修改我们的url路径。但是为什么这次项目在开发,测试,生产启动的时候都 没报错,而且能正常运行???
对于该问题,经过对springmvc 源码的调试跟踪,发现其实我们的常识并没有错,只不过这个相同的url路径中的相同两个字,我们是熟悉而陌生。

一. 接下来,我们先看下我们平时认为的同一个项目中存在相同url路径,项目启动时候报错的情况。

MtSpreadUserController 下面的querySpreadUserInfo url
研发部 > springmvc 中关于配置相同url路径深度剖析 > image2019-3-12 14:19:30.png

SpreadUserController 下面的querySpreadUserInfo url
研发部 > springmvc 中关于配置相同url路径深度剖析 > image2019-3-12 14:20:15.png

好了,让我们启动项目,果不其然,启动中报如下错误:(错误意思就是odm.MtSpreadUserController中已经存在了一个像相同的url路径)

研发部 > springmvc 中关于配置相同url路径深度剖析 > image2019-3-12 14:22:1.png

没错,报错了,让我们调试下,为啥会报错。

打断点,进入AbstractHandlerMethodMapping 中的detectHandlerMethods方法(该方法大概就是将我们定义的url路径映射到具体的方法上)

研发部 > springmvc 中关于配置相同url路径深度剖析 > image2019-3-12 14:27:47.png

找到我们定义的url路径的方法,进入registerHandlerMethod 方法继续看,发现,咦咦咦,这不就是我们报错的信息吗?! 对,是,就是在这报的错。

研发部 > springmvc 中关于配置相同url路径深度剖析 > image2019-3-12 14:31:16.png

mapping如下:

研发部 > springmvc 中关于配置相同url路径深度剖析 > image2019-3-12 14:43:55.png

发现,HandlerMethod oldHandlerMethod = this.handlerMethods.get(mapping); 这一句里面有值,其实这个就是MtSpreadUserController 中的querySpreadUserInfo url路径定义(MtSpreadUserController 先定义,springmvc 先扫描他,所以能获取到值)

研发部 > springmvc 中关于配置相同url路径深度剖析 > image2019-3-12 14:35:13.png

this.handlerMethods其实是个map,key存放url路径,value 存放HandlerMethod(其实就是我们定义的方法)

研发部 > springmvc 中关于配置相同url路径深度剖析 > image2019-3-12 14:37:48.png

好了,到此我们知道了为什么同一个项目中存在相同url路径,项目启动时候报错了。。。。。

二 . 下来再看下同一个项目中存在相同url路径,项目启动时候不报错的情况。

  我们给MtSpreadUserController 下querySpreadUserInfo 中的 @RequestMapping 加上属性method = RequestMethod.POST

研发部 > springmvc 中关于配置相同url路径深度剖析 > image2019-3-12 14:45:3.png

然后启动项目,项目正常启动,无任何错误。。。。。

我们还是在刚刚那个地方打断点看下。此时上述那个错误的地方没有执行,从HandlerMethod oldHandlerMethod = this.handlerMethods.get(mapping);获取的值为null,从而项目正常运行。

研发部 > springmvc 中关于配置相同url路径深度剖析 > image2019-3-12 14:50:4.png

我们查看下this.handlerMethods,就知道为什么了。

研发部 > springmvc 中关于配置相同url路径深度剖析 > image2019-3-12 14:53:22.png 研发部 > springmvc 中关于配置相同url路径深度剖析 > image2019-3-12 14:54:50.png

{[/odm/querySpreadUserInfo],methods=[POST],params=[],headers=[],consumes=[],produces=[],custom=[]} public com.bee.sys.utils.Result com.bee.odm.web.MtSpreadUserController.querySpreadUserInfo(java.lang.String,javax.servlet.http.HttpServletRequest)

{[/odm/querySpreadUserInfo],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]} public com.bee.sys.utils.Result com.bee.odm.web.SpreadUserController.querySpreadUserInfo(com.bee.feiyu.channel.dto.spreadUser.SpreadUser)

发现两个的mapping中除了methods=[POST]之外都一样, 这就是在@RequestMapping 加上属性method = RequestMethod.POST之后。

总结:现在我们发现原来 相同的url路径中的相同两个字 并不只是@RequestMapping(value = Constants.ODM + “/querySpreadUserInfo”)的value相同,而是指@RequestMapping注解所有的属性都相同!!!!!!!!!!!!!!

版权所有:任程鹏

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值