Retornando códigos de status personalizados dos controladores de mola
1. Visão geral
Este artigo rápido demonstrará algumas maneiras dereturn custom HTTP status codes from Spring MVC controllers.
Isso geralmente é importante para expressar mais claramente o resultado de uma solicitação para um cliente e usar a semântica rica e completa do protocolo HTTP. Por exemplo, se algo der errado com uma solicitação, o envio de um código de erro específico para cada tipo de possível problema permitiria ao cliente exibir uma mensagem de erro apropriada para o usuário.
A configuração de um projeto básico do Spring MVC está fora do escopo deste artigo, mas você pode encontrar mais informaçõeshere.
2. Retorno de códigos de status personalizados
O Spring fornece algumas maneiras principais de retornar códigos de status personalizados de suas classesController:
-
usando umResponseEntity
-
usando a anotação@ResponseStatus em classes de exceção, e
-
usando as anotações@ControllerAdvicee@ExceptionHandler.
Essas opções não são mutuamente exclusivas; longe disso, eles podem realmente se complementar.
Este artigo cobrirá as duas primeiras maneiras (ResponseEntitye@ResponseStatus). Se quiser saber mais sobre como usar@ControllerAdvicee@ExceptionHandler, você pode ler sobre issohere.
2.1. Retornando códigos de status por meio de umResponseEntity
Em um controlador Spring MVC padrão, definiremos um mapeamento simples:
@RequestMapping(value = "/controller", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity sendViaResponseEntity() {
return new ResponseEntity(HttpStatus.NOT_ACCEPTABLE);
}
Ao receber uma solicitação GET para “/controller“, o Spring retornará uma resposta com o Código 406 (Não Aceitável). Selecionamos arbitrariamente o código de resposta específico para este exemplo. Você pode retornar qualquer código de status HTTP (a lista completa pode ser encontradahere).
2.2. Retorno de códigos de status por meio de uma exceção
Adicionaremos um segundo método ao controlador para demonstrar como usar umException para retornar um código de status:
@RequestMapping(value = "/exception", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity sendViaException() {
throw new ForbiddenException();
}
Ao receber uma solicitação GET para “/exception“, o Spring lançará umForbiddenException. Esta é uma exceção personalizada que definiremos em uma classe separada:
@ResponseStatus(HttpStatus.FORBIDDEN)
public class ForbiddenException extends RuntimeException {}
Nenhum código é necessário nesta exceção. Todo o trabalho é feito pela anotação@ResponseStatus.
Nesse caso, quando a exceção é lançada, o controlador que a lançou retorna uma resposta com o código de resposta 403 (Proibido). Se necessário, você também pode adicionar uma mensagem na anotação que será retornada junto com a resposta.
Nesse caso, a classe ficaria assim:
@ResponseStatus(value = HttpStatus.FORBIDDEN, reason="To show an example of a custom message")
public class ForbiddenException extends RuntimeException {}
É importante observar que, embora seja tecnicamente possível fazer uma exceção retornar qualquer código de status, na maioria dos casos, faz sentido lógico usar exceções para códigos de erro (4XX e 5XX).
3. Conclusão
O tutorial mostrou como retornar códigos de status personalizados dos controladores Spring MVC.
A implementação pode ser encontrada emexample GitHub project.