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.