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.