试图理解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/test
,AbstractHandlerMethodMapping
将首先查找/test
的任何处理程序方法,如果找到(在我的情况下确实如此),它会将请求传递给该方法 - TestController.test()
,在这种情况下。如果它没有找到任何映射的处理程序方法,那么它将查找/ user / test的任何处理程序方法。
我发现有点古怪,但这是我在日志中观察到的。有人可以用一些官方文件来证实这一点吗?
答案 0 :(得分:0)
检查第一个类级RequestMapping
,然后检查方法级别。所以你所说的行为不可能是afaik。