Spring MVC controller路径是否能重复?

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

背景

有一次面试,面试官问我同一个controller里面路径能不能重复,我斩钉截铁的回答不行,然后问我原因的时候我也不知道,最后面试官微微一笑然后就让我回去等通知了。
最近突然想到这个问题,然后就看了一下源码,在此记录一下

前期准备

我们都知道,如果在同一个controller定义两个一样的请求路径在启动的时候会报错,查询报错提示语所在类就能一步一步查看原因。

创建项目

先创建一个springboot项目,再创建一个controller

TestController.java

@RestController
@RequestMapping("test")
public class TestController {

    @GetMapping("/test2")
    public String test1(){
        return "test1=";
    }

    @GetMapping("/test2")
    public String test2(){
        return "test2=";
    }
}

启动的时候报错,这是因为路径相同了
在这里插入图片描述

查看源码

通过查询报错信息找到了报错所在类的方法:org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.MappingRegistry#assertUniqueMethodMapping
在这里插入图片描述
这个方法的作用是每次把路径映射进来的时候都会检查一下路径是不是重复的,如果重复就抛异常。

MappingRegistry

MappingRegistry 是AbstractHandlerMethodMapping的一个内部类,
官方注释是这样的:
在这里插入图片描述
大概意思就是这个类的作用是维护映射的一个注册表并提供并发访问。

在MappingRegistry里面维护着一个Map<T, MappingRegistration> registry 注册表,还维护一个Map<T, HandlerMethod> mappingLookup,这个mappingLookup存放着所有的映射和方法处理器,并不是线程安全的,MappingRegistry 有个register方法,每次有映射注册的时候首先就是检查路径是否重复,重复就抛异常,然后就是向mappingLookup put进去一条数据进去,同时解析后的数据放到registry 注册表中。

这只是写了一个很简单的URL注入过程,这是针对这个问题的,背后还有很多逻辑就不在这里一一赘述了,以后会再写几篇文章说明的。

能力一般,水平有限,如有问题,请多指出。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring MVC是一种基于MVC(Model-View-Controller)设计模式的Web框架,它可以帮助我们快速地开发Web应用程序。在Spring MVC中,Controller是控制器的核心组件,它负责接收用户请求并决定如何处理这些请求。 在Spring MVC中,我们可以通过编写Controller类来实现请求的处理。在Controller类中,我们可以定义多个方法,每个方法对应处理一个具体的请求。这些方法通常使用注解来标识它们应该处理哪些请求。 例如,我们可以使用@Controller注解来标识一个类为Controller,并使用@RequestMapping注解来标识一个方法应该处理哪些请求。下面是一个简单的Controller类的示例: ``` @Controller @RequestMapping("/hello") public class HelloController { @RequestMapping("/world") public ModelAndView helloWorld() { String message = "Hello World, Spring MVC!"; return new ModelAndView("hello", "message", message); } } ``` 在上面的示例中,我们使用@Controller注解将HelloController类标识为Controller,并使用@RequestMapping注解将该类处理的请求路径设置为“/hello”。我们还使用@RequestMapping注解将helloWorld方法标识为处理“/hello/world”请求的方法。该方法返回一个包含“Hello World, Spring MVC!”消息的ModelAndView对象。 需要注意的是,Controller类的方法可以返回不同类型的结果。除了ModelAndView之外,还可以返回String、void、HttpEntity、ResponseEntity等类型的结果。这些结果将由Spring MVC框架进行处理,并将相应的内容返回给客户端。 总的来说,Spring MVCController是Web应用程序的核心组件之一,它可以帮助我们快速地开发功能强大、易于维护的Web应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

索码理

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值