使用相同的请求映射访问多个控制器

时间:2016-01-04 08:34:10

标签: spring spring-mvc

请找到我的HomeController和DemoController

f1 >> data

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

3 个答案:

答案 0 :(得分:9)

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--部分请求参数。

答案 1 :(得分:6)

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

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

  

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

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

答案 2 :(得分:4)

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

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

onloadend