Renderizando exceções em JSON com Spring

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á.