Usando Spring @ResponseStatus para definir o código de status HTTP
1. Introdução
No Spring MVC, temos várias maneiras deset the status code of an HTTP response.
Neste breve tutorial, veremos a maneira mais direta: usando a anotação@ResponseStatus.
2. Métodos do controlador
Quando um nó de extremidade retorna com êxito, o Spring fornece uma resposta HTTP 200 (OK).
Se quisermos especificarresponse status of a controller method, podemos marcar esse método com@ResponseStatus.. Ele tem dois argumentos intercambiáveis para o status de resposta desejado:code,evalue.. Por exemplo, podemos indicate that the server refuses to brew coffee because it is a teapot:
@ResponseStatus(HttpStatus.I_AM_A_TEAPOT)
void teaPot() {}
Quando queremos sinalizar um erro, podemos fornecer uma mensagem de erro por meio do argumentoreason:
@ResponseStatus(HttpStatus.BAD_REQUEST, reason = "Some parameters are invalid")
void onIllegalArgumentException(IllegalArgumentException exception) {}
Observe que quando definimosreason, o Spring chamaHttpServletResponse.sendError(). Portanto, ele enviará umHTML error page to the client, which makes it a bad fit for REST endpoints.
Observe também que o Spring usa apenas@ResponseStatus, quandothe marked method completes successfully (sem lançar umException).
3. Com manipuladores de erros
Temos três maneiras de usar@ResponseStatus para converter umException em um status de resposta HTTP:
-
usando@ExceptionHandler
-
usando@ControllerAdvice
-
marcando a classeException
Para usar as duas primeiras soluções, precisamos definir um método de tratamento de erros. Você pode ler mais sobre este tópico emthis article.
Podemos usar@ResponseStatus com esses métodos de tratamento de errosthe same way we did with regular MVC methods na seção anterior.
Quando não precisamos de respostas de erro dinâmicas, a solução mais direta é a terceira: marcar a classe Exceção com@ResponseStatus:
@ResponseStatus(code = HttpStatus.BAD_REQUEST)
class CustomException extends RuntimeException {}
Quando o Spring captura esseException, ele usa as configurações que fornecemos em@ResponseStatus.
Observe que quando marcamos uma classeException com@ResponseStatus, o Spring sempre chamaHttpServletResponse.sendError(), independentemente de definirmosreason ou não.
Observe também que o Spring usa a mesma configuração para subclasses, a menos que as marcemos com@ResponseStatus também.
4. Conclusão
Neste artigo, vimos como podemos usar@ResponseStatus para definir o código de resposta HTTP em diferentes cenários, incluindo tratamento de erros.
Como de costume, os exemplos estão disponíveisover on GitHub.