SpringMVC的URL组成,以及URI中对/斜杠的处理,解决IllegalStateException: Ambiguous mapping
SpringMVC的URL组成
ip + 端口号 + 上下文 + 类上的@RequestMapping的URI + 方法上的@RequestMapping的URI
规则
- 非空URI前会自动拼接/
- 连续的斜杠会被替换成单个斜杠
- 方法的URI前没有斜杠与只有一个斜杠的两种接口,同时存在时,拼接前面的斜杠后再替换重复斜杠,得到的结果相同,无法确定最终映射接口,有歧义,启动报错
java.lang.IllegalStateException: Ambiguous mapping
- 配置server.servlet.context-path上下文时,需手动添加前置斜杠,如 server.servlet.context-path=/my-context
演示代码
package com.example.controllerdemo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
// 类上的@RequestMapping的URI,前面是否有斜杠的结果相同,后面是否有斜杠会影响 @GetMapping() 不指定URI的请求地址
//@RequestMapping("easy")
//@RequestMapping("/easy")
@RequestMapping("easy/")
//@RequestMapping("/easy/")
//@RequestMapping("easy")
public class TestController {
@GetMapping()
public String test() {
return "no";
}
// 请求地址 http://localhost:8080/my-context/easy/test
@GetMapping("test")
public String test1() {
return "test";
}
// 前面没有斜杠或者只有一个斜杠,结果是相同的,两种接口同时存在时有歧义
// 启动时无法确定用哪个,报错java.lang.IllegalStateException: Ambiguous mapping
// 请求地址 http://localhost:8080/my-context/test,与 @GetMapping("test") 相同
// @GetMapping("/test")
// public String test2() {
// return "/test";
// }
// 请求地址 http://localhost:8080/my-context/easy/test/
@GetMapping("test/")
public String test3() {
return "test/";
}
// @GetMapping("/test/")
// public String test31() {
// return "/test/";
// }
// 方法前的多个连续的斜杠会被处理成单个斜杠,虽然不会因为Ambiguous mapping启动报错,但无法被访问
// 发送 http://localhost:8080/my-context/easy//test 请求会按照 http://localhost:8080/my-context/easy/test 处理
@GetMapping("//test")
public String test21() {
return "//test";
}
}