J'ai un contrôleur simple qui ressemble à ceci:-
@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) {
...
}
}
En gros, cette page a les fonctionnalités suivantes:-
- L'utilisateur visite la page principale (
/groups GET
). - L'utilisateur crée un nouveau groupe (
/groups POST
) ou sélectionne un groupe spécifique (/groups/1 GET
). - L'utilisateur modifie un groupe existant (
/groups/1 POST
).
Je comprends comment les deux mappings de requête GET fonctionnent ici. Le mappage n°2 est défini, sinon ( /groups/1 GET
) provoquera une exception "No mapping found".
Ce que j'essaie de comprendre ici, c'est pourquoi le mapping n°3 gère les deux ( /groups POST
) et ( /groups/1 POST
) ? Il est logique qu'il gère ( /groups POST
) ici puisque le mappage de la demande correspond à l'URI. Pourquoi ( /groups/1 POST
) n'est pas à l'origine de l'exception "No mapping found" ? En fait, il semble presque que tout POST dont l'URI commence par /groups (ex : /groups/bla/1 POST
) seront également traités par le mapping n°3.
Quelqu'un peut-il me fournir une explication claire à ce sujet ? Merci beaucoup.
CLARIFICATION
Je comprends le fait que je peux utiliser des méthodes plus appropriées (comme GET, POST, PUT ou DELETE)... ou je peux créer encore un autre mappage de requête à gérer... /groups/{id} POST
.
Cependant, ce que je veux vraiment savoir c'est...
.... "Pourquoi la cartographie n°3 gère-t-elle /groups/1 POST
aussi ?"
Le raisonnement de la "correspondance la plus proche" ne semble pas être valable, car si je supprime le mappage n° 2, je pense que le mappage n° 1 s'en chargera. /groups/1 GET
mais ce n'est pas le cas et cela provoque une exception "No mapping found".
Je suis juste un peu perplexe ici.