Понимание того, как работает Spring MVC's @RequestMapping POST

У меня есть простой контроллер, который выглядит так:-

@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, но это не так, и это вызовет Исключение "Сопоставление не найдено".

Я просто немного запутался.

32
задан Aniket Kulkarni 9 October 2015 в 09:39
поделиться