采访后,面试官问我是否可以重复同一控制器中的道路。我无法回答答案,然后问我什么时候不知道原因。最后,访调员微微微笑,然后要求我回到通知。我突然想到了这个问题,然后查看了源代码并在此处记录下来。阅读源代码后,我发现路径可以可以重复
首先创建一个Springboot项目,然后创建用于测试的TestController。
路径重复问题分为以下三种情况:
以下是测试说明:
这种情况在启动时不会报告错误,然后您将通过访问测试报告错误。测试结果是错误。查看异常信息类似于上述信息。
这种情况在开始时不会报告错误。
第一种情况是启动时的错误。通过查询错误消息来报告错误的方法:org.springframework.web.servlet.handler.abstracthandlermetmapping.mappingregility#validateTemethodmapping
ValidateMethodmapping方法是确定某种方法的路径是否在映射注册表中是否存在映射。如果它存在并且与当前的手术不同(有不同的条件与bean或bean或方法不同)。
因为第一种情况是相同的,所以两种方法是相同的,但是该方法是不同的,因此启动时它是异常的。
上面提到的注册表注册表是Abstracthandlmethodmapping内部类映射注册表的变量。
该类的作用可能是维护映射的注册表并提供并发访问。
主要维护地图
映射属性retriber remistry注册表是requestmappinginfo的对象,请求mappationinfo重写等于
由于第二种情况,路径和请求方法是相同的,但是路径参数是不同的,也就是说,requestMappingInfo对象中的模式条件属性是不同的,因此在启动时不会报告错误。查询路径匹配时将报告。
LookupHandLermethod方法的作用是找到当前请求的最佳途径。首先,检查是否没有路径路径参数。如果不是,请找到符合注册表规则的路径。无论是首选等于第二选择,相同的选择都是不同的,并且比较对象也是requestMappingInfo对象。
当请求进来时,如何选择路径的最佳选择?根据RequestMappinginfo的比较方法的顺序,匹配规则是匹配的,最匹配的是最佳选择。
对于第三个情况路径,请求方法是不同的。因为比较请求mappinginfo对象重写了等效方法,因此由于方法范围是不同的,因此它最终可以重复该错误。
通过源代码,我们可以找到控制器中的方法使用@requestmapping注释或其导数注释(例如:@getMapping,@postmapping),将其映射为requestMappingInfo对象。是否重复进行比较路径主要取决于请求mappinginfo对象的等值方法。因此,上面提到的第三种情况可以重复该路径,并重复请求方法。实际上,有很多方法可以重复它。只要您使用@RequestMapping注释和派生说明,就可以重复注释中的属性。那些感兴趣的人可以一一尝试。在这里不要测试太多。
能力是平均水平,水平有限。如果您有任何问题,请指出更多。
有关更多文章,您可以注意我的微信公共帐户SunCodernote
原始:https://juejin.cn/post/7097078372899127310