Returnerer egendefinerte statuskoder fra vårkontrollere

1. Oversikt

Denne raske artikkelen vil demonstrere noen måter å returnere tilpassede HTTP-statuskoder fra Spring MVC-kontrollere.

Dette er ofte viktig for å tydeligere uttrykke resultatet av en forespørsel til en klient og bruke den fyldige semantikken til HTTP-protokollen. For eksempel, hvis noe går galt med en forespørsel, vil sending av en spesifikk feilkode for hver type mulig problem tillate klienten å vise en passende feilmelding til brukeren.

Oppsettet av et grunnleggende Spring MVC-prosjekt er utenfor omfanget av denne artikkelen, men du kan finne mer informasjon her.

2. Returnere egendefinerte statuskoder

Spring gir noen få primære måter å returnere egendefinerte statuskoder fra Kontroller klasser:

  • bruker en ResponseEntity
  • bruker @ResponseStatus kommentar på unntaksklasser, og
  • bruker @ControllerAdvice og @ExceptionHandler kommentarer.

Disse alternativene er ikke gjensidig utelukkende; langt fra det, kan de faktisk utfylle hverandre.

Denne artikkelen vil dekke de to første måtene (ResponseEntity og @ResponseStatus). Hvis du vil lære mer om bruk @ControllerAdvice og @ExceptionHandler, du kan lese om det her.

2.1. Returstatuskoder via a ResponseEntity

I en standard Spring MVC-kontroller vil vi definere en enkel kartlegging:

@RequestMapping (value = "/ controller", method = RequestMethod.GET) @ResponseBody public ResponseEntity sendViaResponseEntity () {return new ResponseEntity (HttpStatus.NOT_ACCEPTABLE); }

Ved mottak av en GET-forespørsel om å “/ kontroller“, Spring vil returnere et svar med 406-koden (ikke akseptabelt). Vi valgte vilkårlig den spesifikke responskoden for dette eksemplet. Du kan returnere hvilken som helst HTTP-statuskode (hele listen finner du her).

2.2. Returstatuskoder via unntak

Vi vil legge til en annen metode for kontrolleren for å demonstrere hvordan du bruker en Unntak for å returnere en statuskode:

@RequestMapping (verdi = "/ unntak", metode = RequestMethod.GET) @ResponseBody offentlig ResponseEntity sendViaException () {kast ny ForbiddenException (); }

Ved mottak av en GET-forespørsel om å “/unntak“, Våren vil kaste en ForbiddenException. Dette er et tilpasset unntak som vi vil definere i en egen klasse:

@ResponseStatus (HttpStatus.FORBIDDEN) offentlig klasse ForbiddenException utvider RuntimeException {}

Ingen kode kreves i dette unntaket. Alt arbeidet gjøres av @ResponseStatus kommentar.

I dette tilfellet, når unntaket blir kastet, returnerer kontrolleren som kastet det et svar med svarkoden 403 (Forbidden). Om nødvendig kan du også legge til en melding i kommentaren som vil bli returnert sammen med svaret.

I dette tilfellet vil klassen se slik ut:

@ResponseStatus (verdi = HttpStatus.FORBIDDEN, reason = "For å vise et eksempel på en tilpasset melding") offentlig klasse ForbiddenException utvider RuntimeException {}

Det er viktig å merke seg at selv om det er teknisk mulig å få et unntak til å returnere hvilken som helst statuskode, er det i de fleste tilfeller bare logisk å bruke unntak for feilkoder (4XX og 5XX).

3. Konklusjon

Opplæringen viste hvordan du returnerer egendefinerte statuskoder fra Spring MVC-kontrollere.

Implementeringen finner du i eksemplet med GitHub-prosjektet.