1. 测试:
1. 在两个方法上使用完全相同的@RequestMapping注解
@RequestMapping(value = "/testApi")
@ResponseBody
public String testAPIV1(HttpServletResponse response) {
System.out.println("请求进入...V1");
return "success-V1";
}
@RequestMapping(value = "/testApi")
@ResponseBody
public String testAPIV2(HttpServletResponse response) {
System.out.println("请求进入...V2");
return "success-V2";
}
效果:启动项目,出现异常:模棱两可的异常,映射的bean 方法已经存在。
Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'systemController' method
public java.lang.String com.tellme.controller.SystemController.testAPIV1(javax.servlet.http.HttpServletResponse)
to { /testApi}: There is already 'systemController' bean method
2. @RequestMapping的value相同,但是其他参数(以headers为例)不同。
@RequestMapping(value = "/testApi",headers = {"Api-Version=0.1"})
@ResponseBody
public String testAPIV1(HttpServletResponse response) {
System.out.println("请求进入...V1");
return "success-V1";
}
@RequestMapping(value = "/testApi",headers = {"Api-Version=0.2"})
@ResponseBody
public String testAPIV2(HttpServletResponse response) {
System.out.println("请求进入...V2");
return "success-V2";
}
正常启动项目后,发起请求,请求头中携带Api-Version=0.2
调用V2版本。
结论:(正常情况下)同一个项目中,不能存在含有完全相同@RequestMapping注解的方法。
3. @RequestMapping中的value是通配符
@RequestMapping(value = {"/testA*"})
@ResponseBody
public String testAPIV1(HttpServletResponse response) {
System.out.println("请求进入...V1");
return "success-V1";
}
@RequestMapping(value = "/testAp*")
@ResponseBody
public String testAPIV2(HttpServletResponse response) {
System.out.println("请求进入...V2");
return "success-V2";
}
效果:当请求路径为http://localhost:8082/testAp1
时,调用的是V2版本,当请求路径为http://localhost:8082/testA1
是调用的是V1版本。
结论:即使一个请求可以获取到多个mapping对象时,依旧会返回一个最佳的HandlerMethod。
2. 根据请求映射Handler对象
源码:org.springframework.web.servlet.handler.AbstractHandlerMetho