@requestmapping Spring的优先顺序查询

时间:2014-09-21 20:48:56

标签: java spring spring-mvc

试图理解Spring MVC中@RequestMapping的工作顺序。我有两个不同的控制器如下

@Controller
public class TestController {

    @RequestMapping(value="/test", method=RequestMethod.GET, produces="application/json")
    public @ResponseBody RequestResponse test() {
        log.info("test processed");
        ....
    }
}

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping(value="/test", method=RequestMethod.GET, produces="application/json")
    public @ResponseBody RequestResponse userTest() {
        log.info("user test processed");
        ....
    }
}

当我提出请求www.test.com/user/test时,我希望调用UserController.userTest()方法,但我看到的是调用了TestController.test()方法。

这是Spring开启的日志记录

DEBUG; tid:http-bio-8080-exec-8; DispatcherServlet; DispatcherServlet with name 'dispatcher' processing GET request for [/test-web/user/test]
DEBUG; tid:http-bio-8080-exec-8; AbstractHandlerMethodMapping; Looking up handler method for path /test
DEBUG; tid:http-bio-8080-exec-8; AbstractHandlerMethodMapping; Returning handler method [public com.test.dto.RequestResponse com.test.controller.TestController.test()]
DEBUG; tid:http-bio-8080-exec-8; AbstractBeanFactory; Returning cached instance of singleton bean 'testController' 

有人可以澄清类型和方法级别@RequestMapping订单的顺序或有关此问题的任何文档吗?

调试了一些,并根据调试我可以推断它的工作方式(这绝不是我的问题的答案)是Spring中的AbstractHandlerMethodMapping评估从右到右的请求剩下。

对于传入请求/user/testAbstractHandlerMethodMapping将首先查找/test的任何处理程序方法,如果找到(在我的情况下确实如此),它会将请求传递给该方法 - TestController.test(),在这种情况下。如果它没有找到任何映射的处理程序方法,那么它将查找/ user / test的任何处理程序方法。

我发现有点古怪,但这是我在日志中观察到的。有人可以用一些官方文件来证实这一点吗?

1 个答案:

答案 0 :(得分:0)

检查第一个类级RequestMapping,然后检查方法级别。所以你所说的行为不可能是afaik。