Erstellen Sie zwei Methoden für dasselbe URL-Muster mit unterschiedlichen Argumenten


87

Ich habe ein Szenario, in dem eine URL "serachUser" mit zwei unterschiedlichen Werten (Anforderungsparameter) userId oder UserName kommen kann.

Deshalb habe ich zwei Methoden erstellt

public String searchUserById(@RequestParam long userID, Model model) 
public ModelAndView searchUserByName(@RequestParam String userName)

Aber ich bekomme Ambiguous Mapping gefunden Ausnahme. Der Frühling hat keine Möglichkeit, mit dieser Situation umzugehen.

Antworten:


186

Mit dem paramsParameter können Sie nach HTTP-Parametern filtern. In Ihrem Fall wäre es so etwas wie:

@RequestMapping(value = "/searchUser", params = "userID")
public String searchUserById(@RequestParam long userID, Model model) {
  // ...
}

@RequestMapping(value = "/searchUser", params = "userName")
public ModelAndView searchUserByName(@RequestParam String userName) {
  // ...
}

Die andere Art, wie ich damit umgegangen bin, besteht darin, den Parameter als String zu akzeptieren und dann Long.parseLong () darauf aufzurufen. Wenn es analysiert wird, ist es die Benutzer-ID. Wenn dies nicht der Fall ist, wird der Benutzername angenommen.
CodeChimp

9
Wenn Sie wissen möchten, wie es funktioniert, wenn Sie mehrere Parameter haben, können Sie verwendenparams = { "storeId", "containerLabel" }
cindyxiaoxiaoli

Wenn die URL-Zuordnung und alle anderen Parameter identisch sind, gibt es dann eine Ausnahme für die Bereitstellungszeit?
Janath

Aber wird es möglich sein, dieser URL eine andere Rolle / Funktion zuzuweisen, um sie zu autorisieren?
Kanagavelu Sugumar

2
Verwandte: Swagger unterstützt dies möglicherweise nicht vollständig. Ich habe dieses Problem gefunden: github.com/springfox/springfox/issues/1828 . Ich verwende Spring Fox 2.7.0 und die Swagger-Benutzeroberfläche zeigt nur 1 Methode anstelle von 2. Anscheinend kann dies durch enableUrlTemplating(true)eine experimentelle Swagger-Benutzeroberfläche behoben werden
Stephanie

0

Wenn Sie keinen Wert übergeben, der null ist, können Sie Ihren Coad wie folgt schreiben:

@RequestMapping(value = "/searchUser", params = {"userID","userName"})
public String searchUserById(@RequestParam long userID,@RequestParam String 
userName, 
Model model) {    
if(userID != null){
//..
}else{
// ...
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.