我有一个看起来像这样的简单控制器:-
@Controller
@RequestMapping(value = "/groups")
public class GroupsController {
// mapping #1
@RequestMapping(method = RequestMethod.GET)
public String main(@ModelAttribute GroupForm groupForm, Model model) {
...
}
// mapping #2
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String changeGroup(@PathVariable Long id, @ModelAttribute GroupForm groupForm, Model model) {
...
}
// mapping #3
@RequestMapping(method = RequestMethod.POST)
public String save(@Valid @ModelAttribute GroupForm groupForm, BindingResult bindingResult, Model model) {
...
}
}
基本上,此页面具有以下功能:-
- 用户访问主页 (
/groups GET
)。 - 用户创建一个新组 (
/groups POST
) 或选择一个特定组 (/groups/1 GET
)。 - 用户编辑现有组 (
/groups/1 POST
)。
我了解这两个 GET 请求映射如何在这里工作。映射 #2 已定义,否则 ( /groups/1 GET
) 将导致“未找到映射”异常。
我想在这里理解的是为什么映射#3 同时处理 ( /groups POST
) 和 ( /groups/1 POST
)?/groups POST
因为请求映射匹配 URI ,所以它应该在这里处理 () 是有道理的。为什么 ( /groups/1 POST
) 不会导致此处抛出“未找到映射”异常?事实上,几乎任何 URI 以 /groups (例如:)开头的 POST/groups/bla/1 POST
都将由映射 #3 处理。
有人可以向我提供清楚的解释吗?非常感谢。
澄清
我明白我可以使用更合适的方法(如 GET、POST、PUT 或 DELETE)......或者我可以创建另一个请求映射来处理/groups/{id} POST
.
然而,我真正想知道的是……
.... “为什么映射 #3/groups/1 POST
也能处理?”
“最接近的匹配”推理似乎不成立,因为如果我删除映射 #2,那么我会认为映射 #1 将处理/groups/1 GET
,但它不会,它会导致“未找到映射”异常。
我只是有点难过。