Renderizando exceções em JSON com Spring
1. Introdução
O REST de caminho feliz é bem compreendido e o Spring facilita isso em Java.
Mas e quando as coisas dão errado?
Neste tutorial, examinaremospassing a Java exception as part of a JSON response using Spring.
Para uma visão mais ampla, confira nossas postagens emerror handling for REST with Springecreating a Java global exception handler.
2. Uma solução anotada
Vamos usar três anotações básicas do Spring MVC para resolver isso:
-
@RestControllerAdvice que contém@ControllerAdvice para registrar a classe circundante como algo que cada@Controller deve estar ciente, e@ResponseBody para dizer ao Spring para renderizar a resposta desse método como JSON
-
@ExceptionHandler para dizer ao Spring qual dos nossos métodos deve ser invocado para uma dada exceção
Juntos, eles criam um bean Spring que lida com quaisquer exceções para as quais o configuramos. Aqui estão mais detalhes sobreusing @ControllerAdvice and @ExceptionHandler in conjunction.
3. Exemplo
Em primeiro lugar, vamos criar uma exceção personalizada arbitrária para retornar ao cliente:
public class CustomException extends RuntimeException {
// constructors
}
Em segundo lugar, vamos definir uma classe para lidar com a exceção e passá-la para o cliente como JSON:
@RestControllerAdvice
public class ErrorHandler {
@ExceptionHandler(CustomException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public CustomException handleCustomException(CustomException ce) {
return ce;
}
}
Observe que adicionamos a anotação@ResponseStatus. Isso especificará o código de status a ser enviado ao cliente, no nosso caso, um erro interno do servidor. Além disso, o@ResponseBody garantirá que o objeto seja enviado de volta ao cliente serializado em JSON. Finalmente, abaixo está um controlador fictício que mostra um exemplo de como a exceção pode ser lançada:
@Controller
public class MainController {
@GetMapping("/")
public void index() throws CustomException {
throw new CustomException();
}
}
4. Conclusão
Neste post, mostramos como lidar com exceções no Spring. Além disso, mostramos como enviá-los de volta ao cliente serializado em JSON.
A implementação completa deste artigo pode ser encontradaover on Github. Como é um projeto baseado no Maven, deve ser fácil importar e executar como está.