У меня есть простой контроллер, который выглядит так: -
@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
) здесь не вызывается исключение "Не найдено сопоставление"? На самом деле, почти кажется, что любой POST с URI, начинающимся с / groups (например: /groups/bla/1 POST
), также будет обработан отображением # 3.
Может ли кто-нибудь дать мне четкое объяснение этого? Большое спасибо.
ПОЯСНЕНИЯ
Я понимаю тот факт, что я могу использовать более подходящие методы (например, GET, POST, PUT или DELETE) ... или я могу создать еще одно отображение запроса для обработки /groups/{id} POST
.
Однако, что я действительно хочу знать, это ...
.... "Почему отображение # 3 тоже обрабатывает /groups/1 POST
?"
Кажется, что рассуждения о "ближайшем совпадении" не верны, потому что, если я удаляю отображение # 2, то я думаю, что отображение # 1 будет обрабатывать /groups/1 GET
, но это не так, и это вызывает "Отображение не найдено" «Исключение.
Я просто немного озадачен.