crie dois métodos para o mesmo padrão de url com argumentos diferentes

87

Tenho um cenário em que um url "serachUser" pode vir com dois valores diferentes (parâmetro de solicitação) userId ou UserName.

então para isso criei dois métodos

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

Mas estou recebendo exceção de mapeamento ambíguo encontrado. O Spring tem uma maneira de lidar com essa situação.

Vikas Singh
fonte

Respostas:

186

Você pode usar o paramsparâmetro para filtrar por parâmetros HTTP. No seu caso, seria algo como:

@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
fonte
A outra maneira de lidar com isso é aceitar o parâmetro como String e, em seguida, chamar Long.parseLong () nele. Se analisar, é o userId; se não, assume que é o nome de usuário.
CodeChimp
9
Caso você queira saber como funciona quando você tem vários parâmetros, pode usarparams = { "storeId", "containerLabel" }
cindyxiaoxiaoli
se o mapeamento de url e todos os outros parâmetros forem iguais, há uma exceção de tempo de implantação?
Janath,
Mas será possível atribuir uma função / função diferente a este url para autorizar?
Kanagavelu Sugumar
2
Relacionado: Swagger pode não suportar isso totalmente. Encontrei esse problema github.com/springfox/springfox/issues/1828 . Eu uso Spring Fox 2.7.0 e a IU do Swagger mostra apenas 1 método em vez de 2. Aparentemente, isso pode ser corrigido enableUrlTemplating(true)usando uma IU experimental do Swagger: springfox.github.io/springfox/docs/current/…
Stephanie
0

De qualquer forma, no caso de um parâmetro de solicitação nulo, é permitido se você não passar nenhum valor, ele será nulo, então você pode escrever seu coad como:

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