Korištenje Spring @ResponseStatus za postavljanje HTTP statusnog koda

1. Uvod

U proljetnom MVC-u imamo mnogo načina da to učinimo postaviti statusni kôd HTTP odgovora.

U ovom kratkom vodiču vidjet ćemo najjednostavniji način: korištenje @ResponseStatus bilješka.

2. O metodama kontrolera

Kada se krajnja točka uspješno vrati, Spring pruža HTTP 200 (OK) odgovor.

Ako želimo navesti status odziva metode kontrolera, možemo označiti tu metodu s @ResponseStatus. Ima dva zamjenjiva argumenta za željeni status odgovora: kodirati, i vrijednost. Na primjer, možemo naznačiti da poslužitelj odbija kuhati kavu jer je čajnik:

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

Kada želimo signalizirati pogrešku, možemo pružiti poruku o pogrešci putem razlog argument:

@ResponseStatus (HttpStatus.BAD_REQUEST, reason = "Neki su parametri nevaljani") void onIllegalArgumentException (IllegalArgumentException iznimka) {}

Imajte na umu da kada postavimo razlog, Proljetni pozivi HttpServletResponse.sendError (). Stoga će poslati HTML stranica s pogreškama prema klijentu, što je čini neprikladnom za REST krajnje točke.

Također imajte na umu da Spring koristi samo @ResponseStatus, kada označena metoda uspješno završava (bez bacanja znaka Iznimka).

3. S upravljačima pogreškama

Imamo tri načina za korištenje @ResponseStatus pretvoriti an Iznimka na status HTTP odgovora:

  • koristeći @ExceptionHandler
  • koristeći @ControllerAdvice
  • obilježavanje Iznimka razred

Da bismo koristili prva dva rješenja, moramo definirati metodu obrade pogrešaka. Više o ovoj temi možete pročitati u ovom članku.

Možemo koristiti @ResponseStatus uz ove metode obrade pogrešaka na isti način kao i kod uobičajenih MVC metoda u prethodnom odjeljku.

Kada nam ne trebaju dinamički odgovori na pogreške, najjednostavnije rješenje je treće: označavanje klase Exception s @ResponseStatus:

@ResponseStatus (code = HttpStatus.BAD_REQUEST) klasa CustomException proširuje RuntimeException {}

Kad ovo uhvati Proljeće Iznimka, koristi postavke koje smo naveli u @ResponseStatus.

Imajte na umu da kada označimo znak Iznimka razred sa @ResponseStatus, Proljeće uvijek zove HttpServletResponse.sendError (), da li smo postavili razlog ili ne.

Također imajte na umu da Spring koristi istu konfiguraciju za potklase, osim ako ih ne označimo s @ResponseStatus, isto.

4. Zaključak

U ovom smo članku vidjeli kako se možemo koristiti @ResponseStatus za postavljanje koda HTTP odgovora u različitim scenarijima, uključujući rukovanje pogreškama.

Kao i obično, primjeri su dostupni na GitHubu.