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