Brug af Spring @ResponseStatus til at indstille HTTP-statuskode

1. Introduktion

I Spring MVC har vi mange måder at indstil statuskoden for et HTTP-svar.

I denne korte vejledning vil vi se den mest ligefremme måde: ved hjælp af @ResponseStatus kommentar.

2. Om kontrolmetoder

Når et slutpunkt vender tilbage, giver Spring et HTTP 200 (OK) svar.

Hvis vi vil specificere svarstatus for en controller-metode, kan vi markere den metode med @ResponseStatus. Den har to udskiftelige argumenter for den ønskede svarstatus: kode, og værdi. For eksempel kan vi indikere, at serveren nægter at brygge kaffe, fordi det er en tekande:

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

Når vi vil signalere en fejl, kan vi give en fejlmeddelelse via grund argument:

@ResponseStatus (HttpStatus.BAD_REQUEST, reason = "Nogle parametre er ugyldige") ugyldig påIllegalArgumentException (IllegalArgumentException undtagelse) {}

Bemærk, at når vi indstiller grund, Forår kalder HttpServletResponse.sendError (). Derfor sender den en HTML-fejlside til klienten, hvilket gør det dårligt egnet til REST-slutpunkter.

Bemærk også, at Spring kun bruger @ResponseStatus, hvornår den markerede metode er fuldført (uden at smide en Undtagelse).

3. Med fejlhåndterere

Vi har tre måder at bruge @ResponseStatus at konvertere en Undtagelse til en HTTP-svarstatus:

  • ved brug af @ExceptionHandler
  • ved brug af @ControllerAdvice
  • markering af Undtagelse klasse

For at kunne bruge de to første løsninger skal vi definere en fejlhåndteringsmetode. Du kan læse mere om dette emne i denne artikel.

Vi kan bruge @ResponseStatus med disse fejlhåndteringsmetoder på samme måde som vi gjorde med regelmæssige MVC-metoder i det foregående afsnit.

Når vi ikke har brug for dynamiske fejlsvar, er den mest enkle løsning den tredje: Markering af Exception-klassen med @ResponseStatus:

@ResponseStatus (code = HttpStatus.BAD_REQUEST) klasse CustomException udvider RuntimeException {}

Når foråret fanger dette Undtagelse, det bruger de indstillinger, vi har angivet i @ResponseStatus.

Bemærk, at når vi markerer et Undtagelse klasse med @ResponseStatusForår kalder altid HttpServletResponse.sendError (), om vi sætter grund eller ikke.

Bemærk også, at Spring bruger den samme konfiguration til underklasser, medmindre vi markerer dem med @ResponseStatus, også.

4. Konklusion

I denne artikel så vi, hvordan vi kan bruge @ResponseStatus at indstille HTTP-svarskode i forskellige scenarier, herunder fejlhåndtering.

Som sædvanligt er eksemplerne tilgængelige på GitHub.