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";
}

Antworten:


436

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

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


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.


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.


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"})

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)

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


-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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.