web-dev-qa-db-ja.com

Spring Web MVC:要求パラメーターとパス変数に同じ要求マッピングを使用する

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

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

...または、クライアントがスタイルのHTTP要求パラメーターとしてIDを送信する場合...

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

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

編集:現在(Spring MVC <= 3.0)であるように思われます。ハビの答えの中。

37
ngeek

同じ関数のマッピング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が送信されない場合にもマップされますが、メソッド内でこれを制御できます。

[〜#〜] edit [〜#〜]:前のソリューションは、@PathVariableがない場合、nullに設定されません{null}およびURLをマップできません(ngeekに感謝)。その場合、唯一の解決策は、それぞれが@MappingRequestおよびそれらの1つの内部で他の関数を呼び出すか、他のURLにリダイレクトします(リダイレクト:または転送:Springプレフィックス)。私はこの解決策があなたが探しているものではないことを知っていますが、それはあなたができる最善のものだと思います。実際、コードを複製するのではなく、別のURLを処理する別の関数を作成しています。

50
Javi

それでもPathVariableアプローチに固執したい場合、および構文的に誤ったエラーが400個発生する場合は、このアプローチに従ってください。

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

     System.out.println(pathVariables.get("id"));

   }
4
Vivek

@RequestMapping注釈は、pathまたはnameの代わりにvalue属性の設定をサポートするようになりました。 pathを使用すると、この質問に必要なマッピングを実現できます。

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

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