Spring ResponseStatusException

Spring ResponseStatusException

1. Überblick

In diesem kurzen Tutorial werden wir die neueResponseStatusException-Klasse diskutieren, die im Frühjahr 5 eingeführt wurde. Diese Klasse unterstützt die Anwendung von HTTP-Statuscodes auf HTTP-Antworten.

Eine RESTful-Anwendung kann den Erfolg oder Misserfolg einer HTTP-Anforderung umreturning the right status code in the response to the client kommunizieren. Einfach ausgedrückt, kann ein entsprechender Statuscode dem Client helfen, Probleme zu identifizieren, die möglicherweise aufgetreten sind, während die Anwendung die Anforderung bearbeitet hat.

2. ResponseStatus

Bevor wir uns mitResponseStatusException,befassen, werfen wir einen kurzen Blick auf die Annotation von@ResponseStatus. Diese Anmerkung wurde in Frühjahr 3 eingeführt, um den HTTP-Statuscode auf eine HTTP-Antwort. anzuwenden

Wir können die Annotation@ResponseStatusverwenden, um den Status und den Grund in unserer HTTP-Antwort festzulegen:

@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "Actor Not Found")
public class ActorNotFoundException extends Exception {
    // ...
}

Wenn diese Ausnahme während der Verarbeitung einer HTTP-Anforderung ausgelöst wird, enthält die Antwort den in dieser Anmerkung angegebenen HTTP-Status.

Ein Nachteil des Ansatzes von@ResponseStatusbesteht darin, dass mit Ausnahme eine enge Kopplung erzeugt wird. In unserem Beispiel generieren alle Ausnahmen vom TypActorNotFoundException dieselbe Fehlermeldung und denselben Statuscode in der Antwort.

3. ResponseStatusException

ResponseStatusException ist eine programmatische Alternative zu@ResponseStatus und die Basisklasse für Ausnahmen, die zum Anwenden eines Statuscodes auf eine HTTP-Antwort verwendet werden. Es ist einRuntimeException und muss daher nicht explizit in eine Methodensignatur eingefügt werden.

Spring bietet 3 Konstruktoren zum Generieren vonResponseStatusException:

ResponseStatusException(HttpStatus status)
ResponseStatusException(HttpStatus status, java.lang.String reason)
ResponseStatusException(
  HttpStatus status,
  java.lang.String reason,
  java.lang.Throwable cause
)

ResponseStatusException, Konstruktorargumente:

  • status - Ein HTTP-Status, der auf die HTTP-Antwort gesetzt ist

  • reason - eine Nachricht, in der die auf HTTP-Antwort festgelegte Ausnahme erläutert wird

  • Ursache - aThrowable Ursache fürResponseStatusException

Hinweis: Im Frühjahr fängtHandlerExceptionResolver alle Ausnahmen ab und verarbeitet sie, die von einem Controller ausgelöst und nicht behandelt werden.

Einer dieser Handler,ResponseStatusExceptionResolver,, sucht nachResponseStatusException oder nicht erfassten Ausnahmen, die mit@ResponseStatus kommentiert sind, extrahiert dann den HTTP-Statuscode und den Grund und nimmt sie in die HTTP-Antwort auf.

3.1. ResponseStatusException Vorteile

Die Verwendung vonResponseStatusExceptionhat nur wenige Vorteile:

  • Erstens können Ausnahmen desselben Typs separat verarbeitet und unterschiedliche Statuscodes für die Antwort festgelegt werden, wodurch eine enge Kopplung verringert wird

  • Zweitens werden unnötige zusätzliche Ausnahmeklassen vermieden

  • Schließlich bietet es mehr Kontrolle über die Ausnahmebehandlung, da die Ausnahmen programmgesteuert erstellt werden können

4. Beispiele

4.1. GeneriereResponseStatusException

Lassen Sie uns nun ein Beispiel sehen, das einResponseStatusException generiert:

@GetMapping("/actor/{id}")
public String getActorName(@PathVariable("id") int id) {
    try {
        return actorService.getActor(id);
    } catch (ActorNotFoundException ex) {
        throw new ResponseStatusException(
          HttpStatus.NOT_FOUND, "Actor Not Found", ex);
    }
}

Spring Boot bietet eine Standardzuordnung von/errorund gibt eine JSON-Antwort mit HTTP-Status und der Ausnahmemeldung zurück.

So sieht die Antwort aus:

$ curl -i -s -X GET http://localhost:8080/actor/8
HTTP/1.1 404
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Sun, 28 Jan 2018 19:48:10 GMT

{
    "timestamp": "2018-01-28T19:48:10.471+0000",
    "status": 404,
    "error": "Not Found",
    "message": "Actor Not Found",
    "path": "/actor/8"
}

4.2. Unterschiedlicher Statuscode - Gleicher Ausnahmetyp

Lassen Sie uns nun sehen, wie ein anderer Statuscode auf die HTTP-Antwort gesetzt wird, wenn derselbe Ausnahmetyp ausgelöst wird:

@PutMapping("/actor/{id}/{name}")
public String updateActorName(
  @PathVariable("id") int id,
  @PathVariable("name") String name) {

    try {
        return actorService.updateActor(id, name);
    } catch (ActorNotFoundException ex) {
        throw new ResponseStatusException(
          HttpStatus.BAD_REQUEST, "Provide correct Actor Id", ex);
    }
}

So sieht die Antwort aus:

$ curl -i -s -X PUT http://localhost:8080/actor/8/BradPitt
HTTP/1.1 400
...
{
    "timestamp": "2018-02-01T04:28:32.917+0000",
    "status": 400,
    "error": "Bad Request",
    "message": "Provide correct Actor Id",
    "path": "/actor/8/BradPitt"
}

5. Fazit

In diesem kurzen Tutorial haben wir besprochen, wie einResponseStatusException in unserem Programm erstellt wird.

Wir haben auch betont, dass es programmgesteuert eine bessere Möglichkeit ist, HTTP-Statuscodes in der HTTP-Antwort festzulegen als die Annotation von@ResponseStatus.

Wie immer ist der vollständige Quellcodeover on GitHub verfügbar.