Spring-Webanmerkungen
1. Überblick
In diesem Tutorial werden wir Spring Web-Anmerkungen aus demorg.springframework.web.bind.annotation-Paket untersuchen.
2. @RequestMapping
Einfach ausgedrückt,@RequestMappingmarks request handler methods innerhalb der Klassen von@Controller; Es kann konfiguriert werden mit:
-
path, oder seine Aliase,name, undvalue:, welcher URL die Methode zugeordnet ist
-
method: kompatible HTTP-Methoden
-
params: filtert Anforderungen basierend auf Vorhandensein, Fehlen oder Wert von HTTP-Parametern
-
headers: filtert Anforderungen basierend auf Vorhandensein, Fehlen oder Wert von HTTP-Headern
-
consumes: welche Medientypen die Methode im HTTP-Anforderungshauptteil verwenden kann
-
produces: welche Medientypen die Methode im HTTP-Antworttext erzeugen kann
Hier ist ein kurzes Beispiel dafür, wie das aussieht:
@Controller
class VehicleController {
@RequestMapping(value = "/vehicles/home", method = RequestMethod.GET)
String home() {
return "home";
}
}
Wir könnendefault settings for all handler methods in a @Controller class angeben, wenn wir diese Anmerkung auf Klassenebene anwenden. Das einzigeexception is the URL which Spring won’t override mit Einstellungen auf Methodenebene hängt jedoch die beiden Pfadteile an.
Die folgende Konfiguration hat beispielsweise den gleichen Effekt wie die oben beschriebene:
@Controller
@RequestMapping(value = "/vehicles", method = RequestMethod.GET)
class VehicleController {
@RequestMapping("/home")
String home() {
return "home";
}
}
Darüber hinaus sind@GetMapping,@PostMapping,@PutMapping,@DeleteMapping und@PatchMapping verschiedene Varianten von@RequestMapping, wobei die HTTP-Methode bereits auf GET eingestellt ist. POST, PUT, DELETE bzw. PATCH.
Diese sind seit Spring 4.3 verfügbar.
3. @RequestBody
Fahren wir mit@RequestBody fort - das diebody of the HTTP request to an object abbildet:
@PostMapping("/save")
void saveVehicle(@RequestBody Vehicle vehicle) {
// ...
}
Die Deserialisierung erfolgt automatisch und hängt vom Inhaltstyp der Anforderung ab.
4. @PathVariable
Lassen Sie uns als nächstes über@PathVariable sprechen.
Diese Anmerkung gibt an, dass amethod argument is bound to a URI template variable. Wir können die URI-Vorlage mit der Annotation@RequestMapping angeben und ein Methodenargument mit@PathVariable an einen der Vorlagenteile binden.
Wir können dies mitname oder seinem Alias, dem Argumentvalue, erreichen:
@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable("id") long id) {
// ...
}
Wenn der Name des Teils in der Vorlage mit dem Namen des Methodenarguments übereinstimmt, müssen wir ihn nicht in der Anmerkung angeben:
@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable long id) {
// ...
}
Darüber hinaus können wir eine Pfadvariable optional markieren, indem wir das Argumentrequired auf false setzen:
@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable(required = false) long id) {
// ...
}
5. @RequestParam
Wir verwenden@RequestParam füraccessing HTTP request parameters:
@RequestMapping
Vehicle getVehicleByParam(@RequestParam("id") long id) {
// ...
}
Es hat die gleichen Konfigurationsoptionen wie die Annotation@PathVariable.
Zusätzlich zu diesen Einstellungen können wir mit@RequestParam einen injizierten Wert angeben, wenn Spring keinen oder einen leeren Wert in der Anforderung findet. Um dies zu erreichen, müssen wir das ArgumentdefaultValueetzen.
Durch die implizite Angabe eines Standardwerts werdenrequired auffalse: gesetzt
@RequestMapping("/buy")
Car buyCar(@RequestParam(defaultValue = "5") int seatCount) {
// ...
}
Neben Parametern gibt esother HTTP request parts we can access: cookies and headers. Wir können mit den Anmerkungen@CookieValue and @RequestHeader auf sie zugreifen.
Wir können sie genauso konfigurieren wie@RequestParam.
6. Anmerkungen zur Handhabung von Antworten
In den nächsten Abschnitten werden die häufigsten Anmerkungen zum Bearbeiten von HTTP-Antworten in Spring MVC aufgeführt.
6.1. @ResponseBody
Wenn wir eine Request-Handler-Methode mit@ResponseBody,Spring treats the result of the method as the response itself markieren:
@ResponseBody
@RequestMapping("/hello")
String hello() {
return "Hello World!";
}
Wenn wir eine@Controller-Klasse mit dieser Annotation versehen, wird sie von allen Request-Handler-Methoden verwendet.
6.2. @ExceptionHandler
Mit dieser Annotation können wircustom error handler method deklarieren. Spring ruft diese Methode auf, wenn eine Request-Handler-Methode eine der angegebenen Ausnahmen auslöst.
Die gefangene Ausnahme kann als Argument an die Methode übergeben werden:
@ExceptionHandler(IllegalArgumentException.class)
void onIllegalArgumentException(IllegalArgumentException exception) {
// ...
}
6.3. @ResponseStatus
Wir könnendesired HTTP status of the response angeben, wenn wir eine Anforderungshandlermethode mit dieser Annotation versehen. Wir können den Statuscode mit dem Argumentcodeoder dessen Alias mit dem Argumentvaluedeklarieren.
Außerdem können wir mit dem Argumentreasoneinen Grund angeben.
Wir können es auch zusammen mit@ExceptionHandler verwenden:
@ExceptionHandler(IllegalArgumentException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
void onIllegalArgumentException(IllegalArgumentException exception) {
// ...
}
Weitere Informationen zum HTTP-Antwortstatus finden Sie unterthis article.
7. Andere Webanmerkungen
Einige Anmerkungen verwalten HTTP-Anforderungen oder -Antworten nicht direkt. In den nächsten Abschnitten werden die häufigsten vorgestellt.
7.1. @Controller
Wir können einen Spring MVC-Controller mit@Controller definieren. Weitere Informationen finden Sie unterour article about Spring Bean Annotations.
7.2. @RestController
Die@RestControllercombines @Controller and @ResponseBody.
Daher sind die folgenden Erklärungen gleichwertig:
@Controller
@ResponseBody
class VehicleRestController {
// ...
}
@RestController
class VehicleRestController {
// ...
}
7.3. @ModelAttribute
Mit dieser Annotation können wiraccess elements that are already in the model eines MVC@Controller, angeben, indem wir den Modellschlüssel angeben:
@PostMapping("/assemble")
void assembleVehicle(@ModelAttribute("vehicle") Vehicle vehicleInModel) {
// ...
}
Wie bei@PathVariable und@RequestParam müssen wir den Modellschlüssel nicht angeben, wenn das Argument denselben Namen hat:
@PostMapping("/assemble")
void assembleVehicle(@ModelAttribute Vehicle vehicle) {
// ...
}
Außerdem hat@ModelAttribute eine weitere Verwendung: Wenn wir eine Methode mit dieser Datei kommentieren, wird Springautomatically add the method’s return value to the model:
@ModelAttribute("vehicle")
Vehicle getVehicle() {
// ...
}
Wie zuvor müssen wir den Modellschlüssel nicht angeben, Spring verwendet standardmäßig den Namen der Methode:
@ModelAttribute
Vehicle vehicle() {
// ...
}
Bevor Spring eine Request-Handler-Methode aufruft, ruft es alle mit Anmerkungen versehenen@ModelAttribute-Methoden in der Klasse auf.
Weitere Informationen zu@ModelAttribute finden Sie inthis article.
7.4. @CrossOrigin
@CrossOriginenables cross-domain communication für die mit Anmerkungen versehenen Anforderungshandlermethoden:
@CrossOrigin
@RequestMapping("/hello")
String hello() {
return "Hello World!";
}
Wenn wir eine Klasse damit markieren, gilt dies für alle darin enthaltenen Request-Handler-Methoden.
Mit den Argumenten dieser Anmerkung können wir das CORS-Verhalten optimieren.
Weitere Informationen finden Sie unterthis article.
8. Fazit
In diesem Artikel haben wir gesehen, wie wir HTTP-Anforderungen und -Antworten mit Spring MVC verarbeiten können.
Wie üblich sind die Beispiele inover on GitHub verfügbar.