36 - Formatar validações

Nesta aula, vamos aprender como formatar as validações no Spring Boot para que, quando ocorrerem erros de validação, possamos retornar uma resposta personalizada com o status adequado.

Para isso, utilizamos a anotação @RestControllerAdvice e o tratamento de exceções específicas, como a MethodArgumentNotValidException, para capturar e formatar os erros de validação.

Estrutura do Código

O código a seguir mostra como tratamos as exceções de validação e retornamos uma resposta customizada quando ocorrem erros de validação nos parâmetros de entrada:


package br.com.api.pessoa.configuracao;

// Importações
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.HashMap;
import java.util.Map;
 
// Anotação RestControllerAdvice: Classe que irá tratar exceções de todos os controladores REST da aplicação
@RestControllerAdvice
public class ValidarRequisicoes {

    // Método que lida com a exceção MethodArgumentNotValidException
    @ExceptionHandler(MethodArgumentNotValidException.class)  // Captura a exceção MethodArgumentNotValidException, que ocorre quando há erro de validação nos parâmetros
    @ResponseStatus(HttpStatus.BAD_REQUEST)  // Define que o status HTTP da resposta será 400 (Bad Request), pois a requisição está mal formada
    public ResponseEntity> handleValidationExceptions(MethodArgumentNotValidException ex) {
        
        // Criação de um mapa para armazenar os erros de validação
        Map errors = new HashMap<>();

        // Itera sobre todos os erros de validação encontrados na exceção
        ex.getBindingResult().getAllErrors().forEach(error -> {

            // Obtém o nome do campo que causou o erro de validação
            String fieldName = ((FieldError) error).getField();

            // Obtém a mensagem de erro associada ao campo
            String errorMessage = error.getDefaultMessage();

            // Adiciona o campo e a mensagem de erro ao mapa de erros
            errors.put(fieldName, errorMessage);
        });

        // Retorna uma ResponseEntity com os erros e o status HTTP 400
        return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
    }
}
    

Explicação do Código

A classe ValidarRequisicoes é um componente especial que se aplica a todas as exceções de validação que podem ocorrer nos controladores REST da aplicação. Quando um erro de validação ocorre, o método handleValidationExceptions é acionado.

Esse método captura a exceção MethodArgumentNotValidException, que é lançada quando há erro nos parâmetros enviados para um método de controlador. Dentro do método, criamos um mapa para armazenar os erros de validação, onde a chave é o nome do campo e o valor é a mensagem de erro.

Personalizando a Resposta

Ao final, a resposta com o status HTTP 400 (Bad Request) é retornada com os erros de validação em formato de mapa. Isso garante que, quando o cliente faz uma requisição inválida, ele recebe informações detalhadas sobre os campos que falharam na validação.

Benefícios

Essa abordagem permite que a aplicação seja mais robusta ao lidar com entradas inválidas, proporcionando uma experiência melhor para os desenvolvedores que consomem a API, pois eles recebem mensagens claras sobre o que está errado com os dados fornecidos.

Clique aqui para se tornar membro do canal

Abaixo segue nossa aula no YouTube: