Spring @ResponseStatus gebruiken om HTTP-statuscode in te stellen

1. Inleiding

In Spring MVC hebben we veel manieren om dat te doen stel de statuscode van een HTTP-antwoord in.

In deze korte tutorial zullen we de meest eenvoudige manier zien: het gebruik van de @ResponseStatus annotatie.

2. Op controllermethoden

Wanneer een endpoint met succes terugkeert, biedt Spring een HTTP 200 (OK) -respons.

Als we het responsstatus van een controllermethode, kunnen we die methode markeren met @ResponseStatus. Het heeft twee onderling verwisselbare argumenten voor de gewenste antwoordstatus: code, en waarde. Zo kunnen we aangeven dat de server weigert koffie te zetten omdat het een theepot is:

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

Als we een fout willen signaleren, kunnen we een foutmelding geven via het reden argument:

@ResponseStatus (HttpStatus.BAD_REQUEST, reason = "Sommige parameters zijn ongeldig") void onIllegalArgumentException (IllegalArgumentException-uitzondering) {}

Merk op dat wanneer we instellen reden, Spring roept HttpServletResponse.sendError (). Daarom zal het een HTML-foutpagina naar de client, waardoor deze niet geschikt is voor REST-eindpunten.

Merk ook op dat Spring alleen gebruikt @ResponseStatus, wanneer de gemarkeerde methode is met succes voltooid (zonder een Uitzondering).

3. Met foutafhandelaars

We hebben drie manieren om te gebruiken @ResponseStatus om een Uitzondering naar een HTTP-antwoordstatus:

  • gebruik makend van @BuienRadarNL
  • gebruik makend van @ControllerAdvice
  • markering van de Uitzondering klasse

Om de eerste twee oplossingen te kunnen gebruiken, moeten we een foutafhandelingsmethode definiëren. In dit artikel leest u meer over dit onderwerp.

We kunnen gebruiken @ResponseStatus met deze foutafhandelingsmethoden op dezelfde manier als we deden met reguliere MVC-methoden in de vorige sectie.

Als we geen dynamische foutreacties nodig hebben, is de meest eenvoudige oplossing de derde: de klasse Exception markeren met @ResponseStatus:

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

Wanneer de lente dit opvangt Uitzondering, gebruikt het de instellingen die we hebben opgegeven @ResponseStatus.

Merk op dat wanneer we een Uitzondering les met @ResponseStatus, De lente roept altijd HttpServletResponse.sendError (), of we instellen reden of niet.

Merk ook op dat Spring dezelfde configuratie gebruikt voor subklassen, tenzij we ze markeren met @ResponseStatusook.

4. Conclusie

In dit artikel hebben we gezien hoe we het kunnen gebruiken @ResponseStatus om HTTP-antwoordcode in verschillende scenario's in te stellen, inclusief foutafhandeling.

Zoals gewoonlijk zijn de voorbeelden beschikbaar op GitHub.