Verwenden von Spring @ResponseStatus zum Festlegen des HTTP-Statuscodes

1. Einleitung

In Spring MVC gibt es viele Möglichkeiten, den Statuscode einer HTTP-Antwort festzulegen .

In diesem kurzen Tutorial sehen wir den einfachsten Weg: Verwenden der Annotation @ResponseStatus .

2. Über Controller-Methoden

Wenn ein Endpunkt erfolgreich zurückgegeben wird, gibt Spring eine HTTP 200-Antwort (OK).

Wenn wir den Antwortstatus einer Controller-Methode angeben möchten , können wir diese Methode mit @ResponseStatus markieren. Es gibt zwei austauschbare Argumente für den gewünschten Antwortstatus: Code und Wert. Zum Beispiel können wir angeben, dass der Server sich weigert, Kaffee zu kochen, weil es sich um eine Teekanne handelt:

@ResponseStatus(HttpStatus.I_AM_A_TEAPOT) void teaPot() {}

Wenn wir einen Fehler signalisieren möchten, können wir über das Argument reason eine Fehlermeldung bereitstellen :

@ResponseStatus(HttpStatus.BAD_REQUEST, reason = "Some parameters are invalid") void onIllegalArgumentException(IllegalArgumentException exception) {}

Beachten Sie , dass , wenn wir setzen Grund , Frühling ruft HttpServletResponse.sendError () . Daher wird eine HTML-Fehlerseite an den Client gesendet, wodurch sie für REST-Endpunkte nicht geeignet ist .

Beachten Sie außerdem, dass Spring @ResponseStatus nur verwendet , wenn die markierte Methode erfolgreich abgeschlossen wurde (ohne eine Ausnahme auszulösen ).

3. Mit Fehlerbehandlungsroutinen

Wir haben drei Möglichkeiten, mit @ResponseStatus eine Ausnahme in einen HTTP-Antwortstatus zu konvertieren :

  • mit @ExceptionHandler
  • mit @ControllerAdvice
  • Kennzeichnung der Exception - Klasse

Um die ersten beiden Lösungen verwenden zu können, müssen wir eine Fehlerbehandlungsmethode definieren. Weitere Informationen zu diesem Thema finden Sie in diesem Artikel.

Wir können @ResponseStatus mit diesen Fehlerbehandlungsmethoden genauso verwenden wie mit regulären MVC-Methoden im vorherigen Abschnitt.

Wenn wir keine dynamischen Fehlerantworten benötigen, ist die dritte die einfachste Lösung: Markieren der Exception-Klasse mit @ResponseStatus:

@ResponseStatus(code = HttpStatus.BAD_REQUEST) class CustomException extends RuntimeException {}

Wenn Spring diese Ausnahme abfängt , werden die Einstellungen verwendet, die wir in @ResponseStatus angegeben haben .

Beachten Sie, dass Spring beim Markieren einer Ausnahmeklasse mit @ResponseStatus immer HttpServletResponse.sendError () aufruft, unabhängig davon , ob wir den Grund festlegen oder nicht.

Beachten Sie auch, dass Spring dieselbe Konfiguration für Unterklassen verwendet, es sei denn, wir markieren sie auch mit @ResponseStatus .

4. Fazit

In diesem Artikel haben wir gesehen, wie wir mit @ResponseStatus HTTP-Antwortcode in verschiedenen Szenarien festlegen können , einschließlich der Fehlerbehandlung.

Wie üblich sind die Beispiele auf GitHub verfügbar.