Bruk Spring @ResponseStatus til å angi HTTP-statuskode

1. Introduksjon

I vår MVC har vi mange måter å angi statuskoden til et HTTP-svar.

I denne korte opplæringen vil vi se den enkleste måten: å bruke @ResponseStatus kommentar.

2. Om kontrollermetoder

Når et endepunkt returnerer vellykket, gir Spring et HTTP 200 (OK) svar.

Hvis vi vil spesifisere svarstatus for en kontrollermetode, kan vi merke den metoden med @ResponseStatus. Den har to utskiftbare argumenter for ønsket svarstatus: kode, og verdi. For eksempel kan vi indikere at serveren nekter å brygge kaffe fordi det er en tekanne:

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

Når vi vil signalisere en feil, kan vi gi en feilmelding via grunnen til argument:

@ResponseStatus (HttpStatus.BAD_REQUEST, reason = "Noen parametere er ugyldige") ugyldig påIllegalArgumentException (unntak fra IllegalArgumentException) {}

Legg merke til at når vi setter grunnen til, Ringer våren HttpServletResponse.sendError (). Derfor vil den sende en HTML-feilside til klienten, noe som gjør det dårlig egnet for REST-sluttpunkter.

Vær også oppmerksom på at Spring bare bruker @ResponseStatus, når den merkede metoden fullføres (uten å kaste en Unntak).

3. Med feilbehandlere

Vi har tre måter å bruke @ResponseStatus å konvertere en Unntak til HTTP-svarstatus:

  • ved hjelp av @ExceptionHandler
  • ved hjelp av @ControllerAdvice
  • markering av Unntak klasse

For å kunne bruke de to første løsningene, må vi definere en feilbehandlingsmetode. Du kan lese mer om dette emnet i denne artikkelen.

Vi kan bruke @ResponseStatus med disse feilbehandlingsmetodene på samme måte som vi gjorde med vanlige MVC-metoder i forrige avsnitt.

Når vi ikke trenger dynamiske feilresponser, er den mest enkle løsningen den tredje: å markere Exception-klassen med @ResponseStatus:

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

Når våren fanger dette Unntak, den bruker innstillingene vi ga i @ResponseStatus.

Merk at når vi merker et Unntak klasse med @ResponseStatus, Våren kaller alltid HttpServletResponse.sendError (), om vi setter grunnen til eller ikke.

Vær også oppmerksom på at Spring bruker samme konfigurasjon for underklasser, med mindre vi merker dem med @ResponseStatusogså.

4. Konklusjon

I denne artikkelen så vi hvordan vi kan bruke @ResponseStatus for å angi HTTP-responskode i forskjellige scenarier, inkludert feilhåndtering.

Som vanlig er eksemplene tilgjengelige på GitHub.