Wie verwende ich im Frühjahr mehrere @ RequestMapping-Anmerkungen?

247

Ist es möglich, mehrere @RequestMappingAnmerkungen über eine Methode zu verwenden?

Mögen :

@RequestMapping("/")
@RequestMapping("")
@RequestMapping("/welcome")
public String welcomeHandler(){
  return "welcome";
}
Freiwillige
quelle

Antworten:

436

@RequestMappinghat einen String[]Wertparameter, daher sollten Sie in der Lage sein, mehrere Werte wie diesen anzugeben:

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

Ed Brannin
quelle
2
Trotzdem habe ich Probleme, die Werte "" oder "/" in meiner Anwendung tatsächlich zum Laufen zu bringen. Arbeiten sie für dich?
Ed Brannin
Gibt es eine Möglichkeit, jeder Anforderungs-URL mithilfe mehrerer Anmerkungen unterschiedliche Erfolgsansichten und Formularansichten zuzuordnen?
k-den
@ EdBrannin Ich brauche viele zu verwenden, benutzerdefinierte, Header, verbraucht, Parameter, etc.
deFreitas
Ich würde auch gerne wissen, woher ich weiß, welches Requestmapping aufgerufen wurde. ist es / oder willkommen?
Siddharth
1
@Siddharth 1. Möglicherweise können Sie einen Parameter vom Typ HttpRequest hinzufügen und überprüfen. 2. Wenn es Ihnen wirklich wichtig ist, welches Mapping aufgerufen wurde, verwenden Sie diese Technik möglicherweise nicht. ;)
Ed Brannin
24

Aus meinem Test (Frühjahr 3.0.5), @RequestMapping(value={"", "/"}) - "/"funktioniert nur , ""nicht. Allerdings habe ich herausgefunden, dass dies funktioniert : @RequestMapping(value={"/", " * "}), das " * "passt zu allem, so dass es der Standard-Handler ist, falls keine anderen.

Alan Zhong
quelle
13

Muss nicht. Die Annotation RequestMapping unterstützt Platzhalter und Pfade im Ameisenstil. Sieht auch so aus, als ob Sie nur eine Standardansicht möchten, damit Sie setzen können

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

in Ihrer Konfigurationsdatei. Dadurch werden alle Anfragen an das Stammverzeichnis an die Begrüßungsansicht weitergeleitet.

Robby Pond
quelle
Soll zwischen diesen beiden Zeilen etwas sein? Ich verwende den FreeMarkerViewResolver - also müsste ich diesen Weg gehen ... Nun, ich denke, ich könnte einfach mehrere ViewResolver erstellen.
Freiwillige
2
Es bietet nicht die Flexibilität, die mehrere RequestMapping-Anmerkungen bieten würden. Zum Beispiel, wenn ich möchte, dass eine Methode entweder den Wert "/ a" mit POST oder den Wert "/ b" mit GET unterstützt. Natürlich ist die Problemumgehung ziemlich einfach (Umgestaltung der Funktionalität in einer dritten Methode), aber nur zu sagen, dass dies nützlich wäre.
Simon
1

Der kürzeste Weg ist: @RequestMapping({"", "/", "welcome"})

Obwohl Sie auch tun können:

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

Im Moment funktioniert die Verwendung von Spring-Boot 2.0.4 - {} nicht.

@RequestMapping

hat immer noch String [] als Wertparameter, daher sieht die Deklaration folgendermaßen aus:

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

** Update - Funktioniert mit Spring-Boot 2.2 **

 @RequestMapping(value={"/","/index","/login","/home"}, method = RequestMethod.GET)
Falke
quelle
Die eckigen Klammern sind ungültig. Die gültige Syntax für ein Array-Literal ist die Verwendung von geschweiften Klammern {}
luis.espinal
@ luis.espinal Eckige Klammern funktionierten mit der Spring-Boot-Version 2.0.4. Ich werde meinen Beitrag aktualisieren.
Falcon
0

Folgendes ist ebenfalls akzeptabel:

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

Gleiches gilt @RequestMappingauch für

Pritam Banerjee
quelle
-2

Es ist besser, die PathVariable-Annotation zu verwenden, wenn Sie immer noch den aufgerufenen Uri erhalten möchten.

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

oder analysieren Sie es vom Anforderungsobjekt.

CQLI
quelle