spring 使用相同的请求Map访问多个控制器

8qgya5xd  于 2023-03-22  发布在  Spring
关注(0)|答案(3)|浏览(136)

请找到我的HomeController和DemoController

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

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

当我尝试发送一个请求到index时,哪一个会被执行?我想知道我们如何为多个控制器提供相同的请求Map值

svgewumm

svgewumm1#

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

eufgjt7s

eufgjt7s2#

Spring Web MVC中这是不可能的。每个Map在您的上下文中必须是唯一的。如果不是,您将在上下文初始化期间收到RuntimeException
您甚至不能使用参数来区分端点,因为在搜索合适的处理程序(适用于Servlet环境)时不会对它们进行评估。来自@RequestMapping javadoc:
在Servlet环境中,参数Map被认为是在类型级别强制执行的限制。主路径Map(即指定的URI值)仍然必须唯一地标识目标处理程序,参数Map只是表示调用处理程序的先决条件。
请注意,您可以执行相反的操作,因此多个URL可以指向同一个处理程序。

lvjbypge

lvjbypge3#

不幸的是,这是不可能的,请求Map必须是唯一的,否则应用程序无法确定传入的请求应该Map到哪个方法。
你可以做的是扩展请求Map:

class HomeController{

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

class DemoController{

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

相关问题