私は次のような単純なコントローラーを持っています:-
@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
) が「マッピングが見つかりません」という例外をスローしないのはなぜですか? 実際、/groups (例: ) で始まる URI を持つすべての POST/groups/bla/1 POST
もマッピング #3 によって処理されるようです。
誰かが私にこれについて明確な説明を提供できますか? どうもありがとう。
明確化
より適切なメソッド (GET、POST、PUT、DELETE など) を使用できるという事実を理解しています... または、処理する別のリクエスト マッピングを作成できます/groups/{id} POST
。
しかし、私が本当に知りたいのは...
.... 「なぜマッピング #3 も処理する/groups/1 POST
のですか?」
「最も近い一致」の推論は当てはまらないようです。なぜなら、マッピング #2 を削除すると、マッピング #1 が を処理すると思うからです/groups/1 GET
が、そうではなく、「マッピングが見つかりません」という例外が発生します。
私はここで少し困惑しています。