Използване на Spring @ResponseStatus за задаване на HTTP код за състояние

1. Въведение

В Spring MVC имаме много начини да зададем кода на състоянието на HTTP отговор .

В този кратък урок ще видим най- лесния начин: използване на анотацията @ResponseStatus .

2. За методите на контролера

Когато една крайна точка се върне успешно, Spring предоставя HTTP 200 (OK) отговор.

Ако искаме да посочим състоянието на отговора на метод на контролера , можем да маркираме този метод с @ResponseStatus. Той има два взаимозаменяеми аргумента за желания статус на отговор: код и стойност. Например можем да посочим, че сървърът отказва да вари кафе, защото е чайник:

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

Когато искаме да сигнализираме за грешка, можем да предоставим съобщение за грешка чрез аргумента причина :

@ResponseStatus(HttpStatus.BAD_REQUEST, reason = "Some parameters are invalid") void onIllegalArgumentException(IllegalArgumentException exception) {}

Имайте предвид, че когато зададем причина , Spring извиква HttpServletResponse.sendError () . Следователно, той ще изпрати страница за грешка в HTML на клиента, което го прави лошо за REST крайни точки .

Също така имайте предвид, че Spring използва само @ResponseStatus , когато маркираният метод завърши успешно (без да се прави изключение ).

3. С обработчици на грешки

Имаме три начина да използваме @ResponseStatus за преобразуване на изключение в състояние на HTTP отговор:

  • използвайки @ExceptionHandler
  • с помощта на @ControllerAdvice
  • маркиране на класа на изключението

За да използваме първите две решения, трябва да дефинираме метод за обработка на грешки. Можете да прочетете повече за тази тема в тази статия.

Можем да използваме @ResponseStatus с тези методи за обработка на грешки по същия начин, както направихме с обикновените MVC методи в предишния раздел.

Когато не се нуждаем от динамични отговори на грешки, най- ясното решение е третото: маркиране на класа на изключение с @ResponseStatus:

@ResponseStatus(code = HttpStatus.BAD_REQUEST) class CustomException extends RuntimeException {}

Когато Spring улавя това изключение , той използва настройките, които сме предоставили в @ResponseStatus .

Имайте предвид, че когато маркираме клас на изключение с @ResponseStatus , Spring винаги извиква HttpServletResponse.sendError () , независимо дали задаваме причина или не.

Също така имайте предвид, че Spring използва същата конфигурация за подкласове, освен ако не ги маркираме и с @ResponseStatus .

4. Заключение

В тази статия видяхме как можем да използваме @ResponseStatus за задаване на HTTP код за отговор в различни сценарии, включително обработка на грешки.

Както обикновено, примерите са достъпни в GitHub.