springmvc handler mapping 探讨

springmvc handler mapping

springmvc 内部初始化的HandlerMapping

  1. "faviconHandlerMapping" -> {SimpleUrlHandlerMapping}

  2. "requestMappingHandlerMapping" -> {RequestMappingHandlerMapping}

  3. "beanNameHandlerMapping" -> {BeanNameUrlHandlerMapping}

  4. "resourceHandlerMapping" -> {SimpleUrlHandlerMapping}

  5. "welcomePageHandlerMapping" -> {WelcomePageHandlerMapping}

springmvc 内部如何判断一个路径映射是否重复

MappingRegistry 是中有一个字段为mappingLookup 。这是一个Map集合,其中key是RequestMappingInfo而value正是映射的HandlerMethod。 RequestMappingInfo 中包含了能够区分一个路径映射是否重复的信息。

RequestMappingInfo 代码详单如下(省略方法部分)

public final class RequestMappingInfo implements RequestCondition<RequestMappingInfo> {
​
   @Nullable
   private final String name;//@RequestMapping 配置的name 但是一直为空 实验的时候
​
   private final PatternsRequestCondition patternsCondition;//路径映射  /a/b
​
   private final RequestMethodsRequestCondition methodsCondition;// 方法映射  GET POST
​
   private final ParamsRequestCondition paramsCondition;//提交参数  ?a=2
​
   private final HeadersRequestCondition headersCondition;// application/x-www-form-urlencoded
​
   private final ConsumesRequestCondition consumesCondition;//请求的头信息
​
   private final ProducesRequestCondition producesCondition;//相应头信息
​
   private final RequestConditionHolder customConditionHolder;//自定义条件
 
}

assertUniqueMethodMapping 是作为防重复的校验方法的存在,代码详单如下:

private void assertUniqueMethodMapping(HandlerMethod newHandlerMethod, T mapping) {
   HandlerMethod handlerMethod = this.mappingLookup.get(mapping);
   if (handlerMethod != null && !handlerMethod.equals(newHandlerMethod)) {
      throw new IllegalStateException(
            "Ambiguous mapping. Cannot map '" +    newHandlerMethod.getBean() + "' method \n" +
            newHandlerMethod + "\nto " + mapping + ": There is already '" +
            handlerMethod.getBean() + "' bean method\n" + handlerMethod + " mapped.");
   }
}

从上面的代码可以看出,首先通过map集合获取该方法,接着比较是否给定的handlerMethod是否于新入选的newHandlerMethod一致,如果一致则抛出异常。这里的mapping对应的就是RequestMappingInfo。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值