créer deux méthodes pour le même modèle d'URL avec des arguments différents

87

J'ai un scénario où une URL "serachUser" peut venir avec deux valeurs différentes (paramètre de demande) userId ou UserName.

donc pour cela j'ai créé deux méthodes

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

Mais je reçois une exception de mappage ambiguë. Spring a un moyen de gérer cette situation.

Vikas Singh
la source

Réponses:

186

Vous pouvez utiliser le paramsparamètre pour filtrer par paramètres HTTP. Dans votre cas, ce serait quelque chose comme:

@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
la source
L'autre façon dont j'avais géré cela est d'accepter le paramètre en tant que String, puis d'appeler Long.parseLong () dessus. S'il analyse, alors c'est le userId, si ce n'est pas le cas, supposez que c'est le nom d'utilisateur.
CodeChimp
9
Si vous voulez savoir comment cela fonctionne lorsque vous avez plusieurs paramètres, vous pouvez utiliserparams = { "storeId", "containerLabel" }
cindyxiaoxiaoli
si le mappage d'url et tous les autres paramètres sont identiques, donne-t-il une exception de temps de déploiement?
Janath
Mais sera-t-il possible d'attribuer un rôle / une fonction différent à cette URL pour autoriser?
Kanagavelu Sugumar
2
Connexes: Swagger pourrait ne pas prendre totalement en charge cela. J'ai trouvé ce problème github.com/springfox/springfox/issues/1828 . J'utilise Spring Fox 2.7.0 et l'interface utilisateur Swagger n'affiche qu'une seule méthode au lieu de 2. Apparemment, cela peut être corrigé par enableUrlTemplating(true)et en utilisant une interface utilisateur Swagger expérimentale: springfox.github.io/springfox/docs/current/…
Stephanie
0

N'importe quelle manière en cas de requête param null est autorisée si vous ne passez aucune valeur, elle sera nulle alors vous pouvez écrire votre coad comme:

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