2014-03-13 89 views
85

Spring控制器可以處理這兩種請求嗎?Spring MVC中的@RequestParam處理可選參數

1) http://localhost:8080/submit/id/ID123432?logout=true 
2) http://localhost:8080/submit/id/ID123432?name=sam&password=543432 

如果我定義的那種單個控制器:

@RequestMapping (value = "/submit/id/{id}", method = RequestMethod.GET, 
produces="text/xml") 
public String showLoginWindow(@PathVariable("id") String id, 
           @RequestParam(value = "logout", required = false) String logout, 
           @RequestParam("name") String username, 
           @RequestParam("password") String password, 
           @ModelAttribute("submitModel") SubmitModel model, 
           BindingResult errors) throws LoginException {...} 

HTTP請求與 「註銷」 是不能接受的。

如果我定義了兩個控制器分別處理每個請求,Spring會抱怨「已經有'Controller'bean方法...映射」的異常。

回答

107

您還需要給required = falsenamepassword請求參數。這是因爲,當您僅提供logout參數時,實際上它預計爲namepassword以及它們仍然是強制性的。

它工作時,你只給namepassword因爲logout沒有一個強制性的參數感謝required = falselogout已經給。

30

創建2個處理案例的方法。您可以指示@RequestMapping註釋在映射請求時考慮某些參數。這樣你可以很好地將它分成兩種方法。

@RequestMapping (value="/submit/id/{id}", method=RequestMethod.GET, 
       produces="text/xml", params={"logout"}) 
public String handleLogout(@PathVariable("id") String id, 
     @RequestParam("logout") String logout) { ... } 

@RequestMapping (value="/submit/id/{id}", method=RequestMethod.GET, 
       produces="text/xml", params={"name", "password"}) 
public String handleLogin(@PathVariable("id") String id, @RequestParam("name") 
     String username, @RequestParam("password") String password, 
     @ModelAttribute("submitModel") SubmitModel model, BindingResult errors) 
     throws LoginException {...} 
+0

當有人將註銷,名稱和密碼都傳遞給URL時會發生什麼?只要閱讀文檔,它說'!myParam樣式表達式表明指定的參數不應該出現在請求中。「必須嘗試。 –

+1

它會找到最好的匹配,它可能會嘗試使用'handleLogin',否則它會提供一個異常,說明不能找到映射。 –

+0

只需要注意一點:從安全角度來看,註銷應該只接受POST請求,所以_should_有2種方法,並且保持URL不變是毫無意義的。 –

54

作爲Spring 4.1.1部分起你現在能完全支持Java 8 Optionaloriginal ticket),因此在你的榜樣兩個請求將通過您的單一映射端點去,只要你替換required=false與可選爲您3個PARAMS註銷,名稱,密碼:

@RequestMapping (value = "/submit/id/{id}", method = RequestMethod.GET, 
produces="text/xml") 
public String showLoginWindow(@PathVariable("id") String id, 
           @RequestParam(value = "logout") Optional<String> logout, 
           @RequestParam("name") Optional<String> username, 
           @RequestParam("password") Optional<String> password, 
           @ModelAttribute("submitModel") SubmitModel model, 
           BindingResult errors) throws LoginException {...} 
+0

太棒了。謝謝。 https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html – OhadR

+0

嗨,@dimitrisli。我正在使用'@PathVariable(「idOfUser」)可選 idOfUser'。現在我需要獲取/打印** idOfuser **的值。你能不能幫助我,因爲現在打印後我得到**可選[1234] **,但我真正想要的只是** 1234 **。 – Learner

+0

嘿,@dimitrisli。自己想出來。不管怎麼說,多謝拉。 :) – Learner