簡體   English   中英

Spring Web MVC:對請求參數和路徑變量使用相同的請求映射

[英]Spring Web MVC: Use same request mapping for request parameter and path variable

有沒有辦法表明我的Spring Web MVC控制器方法應該通過遞交ID作為URI路徑的一部分的請求來匹配...

@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答案中的討論。

您可以為同一功能設置映射網址,並將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的情況下它也會映射,但你可以在方法中控制它。

編輯 :以前的解決方案不起作用,因為沒有{null}@PathVariable沒有設置為null ,並且它無法映射URL(感謝ngeek)。 我認為唯一可能的解決方案是創建兩個方法,每個方法用@MappingRequest映射,其中一個方法調用另一個函數或重定向到另一個URL(重定向:或轉發:彈簧前綴)。 我知道這個解決方案不是你想要的,但認為這是你能做的最好的。 實際上,您並沒有復制代碼,但是您正在創建另一個函數來處理另一個URL。

如果你仍然想堅持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"));

   }

@RequestMapping注釋現在支持設置path屬性而不是namevalue 使用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) {

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM