[英]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
屬性而不是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) {
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.