Spring MVC:Ant风格RequestMapping URL映射异常问题排查
咱们先从日志和你的代码配置里找线索:
首先看你的EmployeeController类上的@RequestMapping("/*emp*")是Ant风格的前缀,而getEmployeeList()方法上的@RequestMapping("/employees")是以斜杠开头的绝对路径。在Spring MVC的规则里,方法上的路径如果以/开头,默认会直接映射到上下文根路径下,不会和类上的前缀拼接——这就是为什么你访问/Spring/employees能成功,因为日志里明确有/employees的映射记录。
那为什么日志里还会有/*emp*/employees/的映射?这是Spring对Ant风格前缀的额外处理,但它只生成了带末尾斜杠的路径映射,没有生成不带斜杠的/*emp*/employees。所以当你访问/Spring/emp/employees(不带末尾斜杠)时,找不到对应的映射,就返回404了;但如果访问/Spring/emp/employees/(带斜杠),应该是可以正常打开页面的。
根据你的需求,要在现有实现下访问/Spring/emp/employees,可以选下面几种方法:
方法1:修改方法上的RequestMapping路径(推荐)
把方法上的@RequestMapping("/employees")改成不带开头斜杠的形式:
@RequestMapping("employees") public ModelAndView getEmployeeList() { // 原代码不变 }
这样类上的/*emp*会和方法的路径自动拼接,生成/*emp*/employees的映射,不管带不带末尾斜杠的/emp/employees都能匹配到,同时原来的/employees路径会失效(如果需要保留这个路径,可以看方法2)。
方法2:保留双路径映射
如果想同时支持/Spring/employees和/Spring/emp/employees,可以给方法添加多个映射路径:
@RequestMapping(value = {"/employees", "employees"}) public ModelAndView getEmployeeList() { // 原代码不变 }
这样既保留了绝对路径的/employees映射,又生成了和类前缀拼接的/*emp*/employees映射,两个路径都能正常访问。
方法3:临时解决方案(访问时加末尾斜杠)
不需要修改代码,直接访问带末尾斜杠的路径:http://localhost:8080/Spring/emp/employees/,就能匹配到日志里的/*emp*/employees/映射,正常打开页面。
内容的提问来源于stack exchange,提问作者ViV

