создать два метода для одного и того же шаблона URL с разными аргументами

87

У меня есть сценарий, в котором один URL-адрес serachUser может иметь два разных значения (параметр запроса) userId или UserName.

поэтому для этого я создал два метода

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

Но я получаю исключение для неоднозначного сопоставления. Spring может каким-то образом справиться с этой ситуацией.

Викас Сингх
источник

Ответы:

187

Вы можете использовать paramsпараметр для фильтрации по параметрам HTTP. В вашем случае это будет примерно так:

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

@RequestMapping(value = "/searchUser", params = "userName")
public ModelAndView searchUserByName(@RequestParam String userName) {
  // ...
}
Крайгер
источник
Другой способ, которым я справился с этим, - принять параметр как String, а затем вызвать для него Long.parseLong (). Если он анализирует, то это userId, если нет, то предполагается его имя пользователя.
CodeChimp
9
Если вы хотите знать, как это работает, когда у вас есть несколько параметров, вы можете использоватьparams = { "storeId", "containerLabel" }
cindyxiaoxiaoli
если сопоставление URL-адресов и все другие параметры совпадают, возникает ли исключение времени развертывания?
Janath
Но можно ли будет назначить этому URL другую роль / функцию для авторизации?
Канагавелу Сугумар,
2
Связанный: Swagger может не полностью поддерживать это. Я обнаружил эту проблему на github.com/springfox/springfox/issues/1828 . Я использую Spring Fox 2.7.0, и пользовательский интерфейс Swagger показывает только 1 метод вместо 2. По-видимому, это можно исправить с enableUrlTemplating(true)помощью экспериментального пользовательского интерфейса Swagger: springfox.github.io/springfox/docs/current/…
Стефани,
0

В любом случае, если параметр запроса null разрешен, если вы не передаете никакого значения, оно будет нулевым, тогда вы можете написать свою команду, например:

@RequestMapping(value = "/searchUser", params = {"userID","userName"})
public String searchUserById(@RequestParam long userID,@RequestParam String 
userName, 
Model model) {    
if(userID != null){
//..
}else{
// ...
}
Тек.Сайлендра
источник