Article image
Vinícius Cavalheiro
Vinícius Cavalheiro24/05/2023 15:47
Compartilhe

Tratamento de Exceções Personalizadas com Spring Boot em Java

  • #Spring Framework
  • #Java

Tratamento de Exceções Personalizadas com Spring Boot em Java

No desenvolvimento de aplicativos Java usando o framework Spring Boot, o tratamento de exceções é uma parte essencial para garantir uma experiência de usuário suave e lidar adequadamente com erros inesperados. O Spring Boot oferece recursos robustos para capturar e tratar exceções de maneira personalizada, permitindo que os desenvolvedores personalizem o comportamento de manipulação de erros de acordo com as necessidades específicas do aplicativo.

Entendendo as Exceções no Spring Boot

Antes de mergulharmos na criação de tratamentos de exceções personalizados, é importante entender como o Spring Boot lida com exceções internamente. O Spring Boot emprega um mecanismo de manipulação de exceções centralizado chamado "ExceptionHandler". Esse mecanismo captura exceções lançadas por um controlador (controller) e trata-as de acordo com a lógica definida pelo desenvolvedor.

O ponto de partida para o tratamento de exceções personalizadas no Spring Boot é a anotação @ControllerAdvice. Essa anotação marca uma classe como um manipulador de exceções global, que será aplicado a todos os controladores no aplicativo. Por meio do @ControllerAdvice, é possível definir métodos para lidar com exceções específicas ou genéricas.

Criando uma Exceção Personalizada

Antes de criar um tratamento personalizado para uma exceção, é necessário criar a própria exceção personalizada. Para isso, crie uma classe que estenda a classe RuntimeException ou qualquer uma de suas subclasses, dependendo da semântica desejada para a exceção personalizada.

Considere o exemplo de uma exceção personalizada chamada ResourceNotFoundException, que pode ser lançada quando um recurso específico solicitado pelo usuário não for encontrado. A implementação básica da exceção pode ser a seguinte:

public class ResourceNotFoundException extends RuntimeException {
  public ResourceNotFoundException(String message) {
      super(message);
  }
}

A exceção ResourceNotFoundException estende RuntimeException e recebe uma mensagem de erro que será exibida ao usuário quando a exceção for lançada.

Implementando o Tratamento de Exceções Personalizado

Após criar a exceção personalizada, podemos implementar um manipulador de exceções personalizado para lidar com ela. Para fazer isso, crie uma classe anotada com @ControllerAdvice e defina os métodos que serão responsáveis pelo tratamento das exceções.

Aqui está um exemplo de implementação de um manipulador de exceções personalizado para a exceção ResourceNotFoundException:

@ControllerAdvice
public class CustomExceptionHandler {

  @ExceptionHandler(ResourceNotFoundException.class)
  public ResponseEntity<String> handleResourceNotFoundException(ResourceNotFoundException ex) {
      return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
  }

  // Outros métodos de tratamento de exceções...

}

Nesse exemplo, o método handleResourceNotFoundException é anotado com @ExceptionHandler e recebe como parâmetro a exceção ResourceNotFoundException. Dentro desse método, você pode definir a lógica de tratamento desejada. No exemplo acima, ele retorna uma resposta HTTP 404 (Not Found) juntamente com a mensagem de erro da exceção.

Utilizando o Tratamento de Exceções Personalizado

Agora que temos a exceção personalizada e o tratamento definido, podemos usá-los em nosso código. Suponha que você tenha um controlador para lidar com solicitações relacionadas ao recurso que pode não ser encontrado. Você pode simplesmente lançar a exceção personalizada quando necessário, e o manipulador de exceções personalizado cuidará do resto.

Aqui está um exemplo de um controlador que usa a exceção personalizada ResourceNotFoundException:

@RestController
public class ResourceController {

  @Autowired
  private ResourceService resourceService;

  @GetMapping("/resources/{id}")
  public Resource getResourceById(@PathVariable Long id) {
      Resource resource = resourceService.getResourceById(id);
      if (resource == null) {
          throw new ResourceNotFoundException("Resource not found with id: " + id);
      }
      return resource;
  }

  // Outros métodos do controlador...

}

Nesse exemplo, se o recurso não for encontrado, a exceção ResourceNotFoundException será lançada com uma mensagem de erro adequada. O manipulador de exceções personalizado será acionado, retornando uma resposta apropriada para o cliente.



Compartilhe
Comentários (1)
Luiz Café
Luiz Café - 24/05/2023 18:44

Parabéns pelo seu artigo! Explicou muito bem conceitos importantes para o entendimento sobre o tema.