【发布时间】:2015-04-09 23:11:43
【问题描述】:
我们遇到了两个碰巧相互干扰的弹簧控制器的问题。 一个控制器通过通配符前缀匹配 URL 后缀。另一个控制器匹配一个 URL 前缀。我希望从左到右读取 URL,但似乎并非如此。
考虑以下代码(已编辑):
@RequestMapping(value = "/**/abcdefg")
public class Controller1 {...}
@RequestMapping(value = "/**/xyz")
public class Controller2 {...}
@RequestMapping(value = "/some/{path}")
public class Controller3
{
@RequestMapping(value = "/{page}", method = RequestMethod.GET)
public String page(@PathVariable("page") final String page, final Model model)
{ //do sth }
}
现在的问题是,如果调用 URL“/some/path/abcdefg”,Controller1 就会启动。但我想要 Controller3。
不幸的是,这种行为与其他控制器不一样!
如果 URL “/some/path/xyz” 被调用,Controller3 就会启动。这种行为对于控制器来说是可重现的。它的行为始终相同,并且控制器不是随机选择的。
spring 文档以及其他用户提出的问题都指向了这个想法,即采用与给定模式匹配的“第一个”控制器。然而,这对我来说意义不大,因为 Controller1 和 2 有一个 非常 相似的请求映射,但控制器的匹配却不同!
一切都由调度程序 servlet 处理。
有没有人暗示可能会发生什么?
【问题讨论】:
-
映射到
/some/path的控制器将无法处理/some/path/xyz。请向我们展示您的真实映射。 -
/some/path怎么能匹配/some/path/abcd?他们显然不平等。 真正的路径是什么? -
感谢您的快速 cmets!我编辑了代码。确实有一个带有请求映射的控制器方法,“有时”会接听电话,“有时”不会
标签: java spring spring-mvc controller