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

Spring 使用相同的请求映射访问多个控制器,spring,spring-mvc,Spring,Spring Mvc,请找到我的HomeController和DemoController class HomeController{ @RequestMapping(value="index") public void home(){ } } class DemoController{ @RequestMapping(value="index") public void demo(){ } } 当我尝试向索引发送请求时,将执行哪个请求? 我想知道如何为多个控制器提供相同的请求映射值。不幸的是,这是不可能的。请求

请找到我的HomeController和DemoController

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

class DemoController{
@RequestMapping(value="index")
public void demo(){
}
}
当我尝试向索引发送请求时,将执行哪个请求?
我想知道如何为多个控制器提供相同的请求映射值。不幸的是,这是不可能的。请求映射必须是唯一的,否则应用程序无法确定传入请求应映射到哪个方法

您可以改为扩展请求映射:

class HomeController{

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

class DemoController{

   @RequestMapping(value="demo/index")
   public void demo(){
   }
}
这是不可能的。每个映射在您的上下文中都必须是唯一的。如果没有,您将在上下文初始化期间收到一个
运行时异常

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

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

请注意,您可以执行相反的操作,因此多个URL可以指向同一个处理程序。请看一看

在这一点上仅部分正确

您可以让多个控制器方法使用相同的URI,只要您为Spring提供足够的附加信息,说明它应该使用哪个URI。你是否应该这样做是另一个问题。不过,我当然不建议在两个单独的控制器类中使用相同的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
    }
}
class家庭控制器{
@RequestMapping(value=“/index”,params={“!name”,“!foo”})
公共列表项目(){
//从列表中检索某物
}
@请求映射(value=“/index”,params=“name”)
公共列表列表项(字符串名称){
//检索名称类似于%name%的内容列表
}
@RequestMapping(value=“/index”,params={“!name”,“foo”})
公共列表列表项(字符串foo){
//做一些完全不同的事情
}
}

有关重载URI时可能出现的情况的完整文档,请参考@ReqeustMapping文档:。并且,特别是对于节请求参数。

您不能。URL只能映射到单个控制器。它必须是唯一的。请注意,这无论如何都是毫无意义的。URL的全部意义在于它告诉您从何处获取内容。当您使用控制器来分隔大量方法时,这并不是毫无意义的,而是为每个方法添加一个额外的片段来区分它,这样路径仍然是唯一的,因为每个方法都有不同的映射,不会发生冲突。然而,SpringMVC似乎不允许.java.lang.IllegalStateException:不明确的映射(您是否尝试过自己运行它?),该文档至少部分过时了。谢谢你提到它;我将检查并可能打开一个文档问题。@Marco Ferrari如果我想创建两个具有相同RequstMapping的控制器类,并且每个类都有不同的方法和不同的方法,会发生什么RequestMappings@MeladEzzat可以接受。通过快速编辑Boot's getting started来尝试一下,我认为问题在于是否可以在两个控制器中使用相同的
@RequestMapping
,而您的答案解释了如何在一个控制器中多次使用相同的
@RequestMapping