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.

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) {
  // ...
}

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{
// ...
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.