Spring Web Annotations

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.