Spring Web MVC: リクエストパラメータとパス変数に同じリクエストマッピングを使用する 質問する

Spring Web MVC: リクエストパラメータとパス変数に同じリクエストマッピングを使用する 質問する

Spring Web MVC コントローラー メソッドが、URI パスの一部として ID を渡すリクエストによって一致するように表現する方法はありますか...

@RequestMapping(method=RequestMethod.GET, value="campaigns/{id}")
public String getCampaignDetails(Model model, @PathVariable("id") Long id) {

... または、クライアントが ID を次の形式で HTTP リクエスト パラメータとして送信する場合...

@RequestMapping(method=RequestMethod.GET, value="campaigns")
public String getCampaignDetails(Model model, @RequestParam("id") Long id) {

これは、重複したコードを追加したくない、現実世界ではよくある URL スキームのように思えますが、まだ答えを見つけることができませんでした。アドバイスがあれば大歓迎です。

編集:どうやら現在(Spring MVC <= 3.0 の場合)これを実現する方法はありません。Javi の回答内の議論を参照してください。

ベストアンサー1

同じ関数のマッピング URL と設定 ID の両方をオプションとして設定できます。

@RequestMapping(method=RequestMethod.GET, value={"/campaigns","/campaigns/{id}"})
public String getCampaignDetails(Model model,
     @RequestParam(value="id", required=false) Long id,
     @PathVariable("id") Long id2)
{
}

ID が送信されない場合でも同様にマップされますが、メソッド内でこれを制御できます。

編集: 前の解決策は、 が存在しないとき@PathVariableに に設定されず、URL をマップできないため機能しません (ngeek さん、ありがとうございます)。唯一の解決策は、それぞれがマップされた 2 つのメソッドを作成し、そのうちの 1 つで他の関数を呼び出すか、他の URL にリダイレクトすることだと思います (redirect: または forward: Spring プレフィックス)。この解決策はあなたが探しているものではないことはわかっていますが、これが最善の方法だと思います。確かに、コードを複製しているのではなく、別の URL を処理する別の関数を作成しているのです。null{null}@MappingRequest

おすすめ記事