utwórz dwie metody dla tego samego wzorca adresu URL z różnymi argumentami

87

Mam scenariusz, w którym jeden adres URL „serachUser” może mieć dwie różne wartości (parametr żądania) identyfikator użytkownika lub nazwę użytkownika.

więc w tym celu stworzyłem dwie metody

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

Ale otrzymuję wyjątek Niejednoznaczne mapowanie znalezione. Spring ma jakikolwiek sposób na poradzenie sobie z tą sytuacją.

Vikas Singh
źródło

Odpowiedzi:

188

Za pomocą tego paramsparametru można filtrować według parametrów HTTP. W twoim przypadku byłoby to coś takiego:

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

@RequestMapping(value = "/searchUser", params = "userName")
public ModelAndView searchUserByName(@RequestParam String userName) {
  // ...
}
kryger
źródło
Innym sposobem, w jaki sobie z tym poradziłem, jest zaakceptowanie parametru jako String, a następnie wywołanie na nim Long.parseLong (). Jeśli analizuje, to jest to identyfikator użytkownika, jeśli nie, przyjmij, że jest to nazwa użytkownika.
CodeChimp
9
Jeśli chcesz wiedzieć, jak to działa, gdy masz wiele parametrów, możesz użyćparams = { "storeId", "containerLabel" }
cindyxiaoxiaoli
jeśli mapowanie adresów URL i wszystkie inne parametry są takie same, czy jest to wyjątek dotyczący czasu wdrożenia?
Janath
Ale czy będzie możliwe przypisanie innej roli / funkcji do tego adresu URL w celu autoryzacji?
Kanagavelu Sugumar
2
Powiązane: Swagger może nie w pełni to obsługiwać. Znalazłem ten problem na github.com/springfox/springfox/issues/1828 . Używam Spring Fox 2.7.0, a interfejs Swagger pokazuje tylko 1 metodę zamiast 2. Najwyraźniej można to naprawić za enableUrlTemplating(true)pomocą eksperymentalnego interfejsu Swagger: springfox.github.io/springfox/docs/current/…
Stephanie
0

W każdym razie, w przypadku żądania param null jest dozwolone, jeśli nie przekażesz żadnej wartości, będzie ona pusta, a następnie możesz napisać swoją nazwę w następujący sposób:

@RequestMapping(value = "/searchUser", params = {"userID","userName"})
public String searchUserById(@RequestParam long userID,@RequestParam String 
userName, 
Model model) {    
if(userID != null){
//..
}else{
// ...
}
Tek.Sailendra
źródło