【问题标题】:Accessing multiple controllers with same request mapping访问具有相同请求映射的多个控制器
【发布时间】:2016-01-04 08:34:10
【问题描述】:

请找到我的 HomeController 和 DemoController

class HomeController{
@RequestMapping(value="index")
public void home(){
}
}

class DemoController{
@RequestMapping(value="index")
public void demo(){
}
}

当我尝试向索引发送请求时,哪个会被执行? 我想知道我们如何为多个控制器拥有相同的请求映射值

【问题讨论】:

  • 你不能。 URL 只能映射到单个控制器。它必须是独一无二的。
  • 请注意,这无论如何都是没有意义的。 URL 的全部意义在于它告诉你从哪里得到一些东西。
  • 使用控制器分离大量方法并不是没有意义,而是在每个方法中添加一个额外的片段来区分它,这样路径仍然是唯一的,因为每个方法都有不同的映射,没有碰撞。但是 spring mvc 似乎不允许这样做。
  • java.lang.IllegalStateException: 不明确的映射(您尝试自己运行它吗?)

标签: spring spring-mvc


【解决方案1】:

https://stackoverflow.com/a/34590355/2682499 在这一点上只是部分正确。

可以让多个控制器方法使用相同的 URI,只要您向 Spring 提供足够的附加信息来说明应该使用哪一个。您是否应该这样做是一个不同的问题。不过,为了避免混淆,我当然不建议在两个单独的控制器类中使用相同的 URI。

可以做这样的事情:

class HomeController{
    @RequestMapping(value="/index", params = {"!name", "!foo"})
    public List<Something> listItems(){
        // retrieve Something list
    }

    @RequestMapping(value="/index", params = "name")
    public List<Something> listItems(String name) {
        // retrieve Something list WHERE name LIKE %name%
    }

    @RequestMapping(value="/index", params = {"!name", "foo"})
    public List<Something> listItems(String foo) {
        // Do something completely different
    }
}

有关重载 URI 时可能发生的情况的完整文档,您应该参考 @ReqeustMapping 文档:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html。并且,特别是 https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html#params-- 用于部分请求参数。

【讨论】:

  • 我认为问题在于是否可以在两个控制器中使用相同的@RequestMapping,而您的答案解释了如何在单个控制器中多次使用相同的@RequestMapping
【解决方案2】:

Spring Web MVC 这是不可能的。每个映射在您的上下文中必须是唯一的。如果没有,您将在上下文初始化期间收到RuntimeException

您甚至不能使用参数来区分您的端点,因为在搜索合适的处理程序时不会评估它们(适用于 Servlet 环境)。来自@RequestMappingjavadoc:

在 Servlet 环境中,参数映射被视为在类型级别强制执行的限制。主路径映射(即指定的 URI 值)仍然必须唯一标识目标处理程序,参数映射仅表示调用处理程序的先决条件。

请注意,您可以执行相反的操作,因此多个 URL 可以指向同一个处理程序。看看Spring MVC: Mapping Multiple URLs to Same Controller

【讨论】:

  • 该文档至少部分过时了。感谢您提及;我会检查并可能会打开一个文档问题。
  • @Marco Ferrari 如果我想创建两个具有相同 RequstMapping 并且每个具有不同方法和不同方法 RequestMappings 的控制器类会发生什么
  • @MeladEzzat 这是可以接受的。通过快速编辑 Boot 的入门来尝试一下 here
【解决方案3】:

很遗憾,这是不可能的。请求映射必须是唯一的,否则应用程序无法确定传入请求应映射到哪个方法。

您可以做的是扩展请求映射:

class HomeController{

   @RequestMapping(value="home/index")
   public void home(){
   }
}

class DemoController{

   @RequestMapping(value="demo/index")
   public void demo(){
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 2016-08-26
    • 2019-02-15
    相关资源
    最近更新 更多