Usando Spring @ResponseStatus para definir o código de status HTTP

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.