与同一URL匹配的两个Spring控制器导致错误的控制器调用

时间:2015-04-09 14:30:45

标签: java spring spring-mvc controller

我们遇到两个弹簧控制器碰巧相互干扰的问题。 一个控制器通过通配符前缀匹配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启动。这种行为可以为控制器重现。它总是表现相同,控制器不是随机选择的。

弹簧文档以及其他用户提出的问题指出了这个想法,即"第一个"控制器被采用,匹配给定的模式。但是,这对我来说没有多大意义,因为Controller1和2有一个非常类似的请求映射,但控制器的匹配方式不同!

所有内容都由调度程序servlet处理。

有没有人暗示可能会发生什么?

1 个答案:

答案 0 :(得分:5)

这部分我希望从左到右阅读网址,这似乎并非如此。而你是对的,事实并非如此。映射通过特异性解决,相关的文档可用here

  

URI变量和通配符数量较少的模式是   考虑更具体。例如,/hotels/{hotel}/*有1个URI   变量和1张外卡并且被认为更具体   /hotels/{hotel}/**作为1个URI变量和2个通配符。

     

如果两个模式具有相同的计数,则更长的模式是   考虑更具体。例如,/foo/bar*更长   被认为比/foo/*更具体。

     

当两个模式具有相同的计数和长度时,模式具有   更少的外卡被认为更具体。例如   /hotels/{hotel}/hotels/*更具体。

如果两个映射匹配请求,则将应用更具体的映射。根据您的要求制定您的映射以遵循特异性规则