Comment utiliser plusieurs annotations @RequestMapping au printemps?

247

Est-il possible d'utiliser plusieurs @RequestMappingannotations sur une méthode?

Comme :

@RequestMapping("/")
@RequestMapping("")
@RequestMapping("/welcome")
public String welcomeHandler(){
  return "welcome";
}
faire du bénévolat
la source

Réponses:

436

@RequestMappinga un String[]paramètre de valeur, vous devriez donc être en mesure de spécifier plusieurs valeurs comme ceci:

@RequestMapping(value={"", "/", "welcome"})

Ed Brannin
la source
2
Cela dit, j'ai du mal à faire fonctionner les valeurs "" ou "/" dans mon application. Travaillent-ils pour vous?
Ed Brannin
Existe-t-il un moyen d'associer différentes vues de réussite et vues de formulaire à chaque URL de demande à l'aide de plusieurs annotations?
k-den
@EdBrannin J'ai besoin de plusieurs à utiliser, personnalisé, en-tête, consomme, paramètres, etc.
deFreitas
Je voudrais également savoir comment savoir quelle demande de mappage a été appelée. est-ce / ou bienvenue?
Siddharth
1
@Siddharth 1. Vous pourrez peut-être ajouter et inspecter un paramètre de type HttpRequest. 2. Si vous vous souciez vraiment du mappage qui a été appelé, n'utilisez peut-être pas cette technique. ;)
Ed Brannin
24

D'après mon test (printemps 3.0.5), @RequestMapping(value={"", "/"}) - ne "/"fonctionne que, ""ne fonctionne pas. Cependant, j'ai découvert que cela fonctionne:, @RequestMapping(value={"/", " * "})le " * "correspond à n'importe quoi, donc ce sera le gestionnaire par défaut au cas où aucun autre.

Alan Zhong
la source
13

N'en a pas besoin. L'annotation RequestMapping prend en charge les caractères génériques et les chemins de style fourmi. On dirait aussi que vous voulez juste une vue par défaut, donc vous pouvez mettre

<mvc:view-controller path="/" view-name="welcome"/>

dans votre fichier de configuration. Cela transmettra toutes les demandes à la racine à la vue de bienvenue.

Robby Pond
la source
Est-il censé y avoir quelque chose entre ces deux lignes? J'utilise FreeMarkerViewResolver - donc je devrais suivre cette voie ... Eh bien, je suppose que je pourrais simplement créer plusieurs ViewResolver.
bénévole
2
Il n'offre pas la flexibilité que fourniraient plusieurs annotations RequestMapping. Par exemple, si je veux qu'une méthode prenne en charge la valeur "/ a" avec POST ou la valeur "/ b" avec GET. Bien sûr, la solution de contournement est assez facile (refactoriser la fonctionnalité dans une troisième méthode), mais simplement dire que ce serait utile.
simon
1

Le moyen le plus court est: @RequestMapping({"", "/", "welcome"})

Bien que vous puissiez également faire:

  • @RequestMapping(value={"", "/", "welcome"})
  • @RequestMapping(path={"", "/", "welcome"})
Marco
la source
1

Pour l'instant, avec Spring-Boot 2.0.4 - {} ne fonctionnera pas.

@RequestMapping

a toujours String [] comme paramètre de valeur, donc la déclaration ressemble à ceci:

 @RequestMapping(value=["/","/index","/login","/home"], method = RequestMethod.GET)

** Mise à jour - Fonctionne avec Spring-Boot 2.2 **

 @RequestMapping(value={"/","/index","/login","/home"}, method = RequestMethod.GET)
Faucon
la source
Les crochets ne sont pas valides. La syntaxe valide pour un littéral de tableau est d'utiliser des accolades {}
luis.espinal
@ luis.espinal Les crochets ont fonctionné avec la version 2.0.4 Spring-Boot. Je mettrai à jour mon message.
Falcon
0

Ce qui suit est également acceptable:

@GetMapping(path = { "/{pathVariable1}/{pathVariable1}/somePath", 
                     "/fixedPath/{some-name}/{some-id}/fixed" }, 
            produces = "application/json")

La même chose peut être appliquée à @RequestMappingaussi bien

Pritam Banerjee
la source
-2

Il est préférable d'utiliser l'annotation PathVariable si vous souhaitez toujours obtenir l'URI qui a été appelé.

@PostMapping("/pub/{action:a|b|c}")
public JSONObject handlexxx(@PathVariable String action, @RequestBody String reqStr){
...
}

ou l'analyser à partir de l'objet de demande.

CQLI
la source