Pular para conteúdo

Aula 09 - Validação de Dados e Exceções ✅

Nesta aula, vamos garantir que nossa API nunca aceite dados inválidos e que os erros sejam tratados de forma profissional, com mensagens claras.

😊 Por que Validar? 🛡️

O lema de todo desenvolvedor backend deve ser: "Nunca confie nos dados vindos do cliente". O frontend pode ter falhas, ou alguém pode enviar dados maliciosos diretamente para a API.

🧠 Bean Validation

O Spring integra a especificação Bean Validation, permitindo validar campos direto na entidade com anotações.

@Entity
public class Produto {
    @Id @GeneratedValue
    private Long id;

    @NotBlank(message = "O nome é obrigatório")
    private String nome;

    @Positive(message = "O preço deve ser maior que zero")
    private double preco;
}

No Controller, ativamos a validação com @Valid:

@PostMapping
public Produto criar(@Valid @RequestBody Produto produto) {
    return service.salvar(produto);
}

📊 Fluxo de Validação

graph TD
    A[Requisição chega] --> B{Dados válidos?}
    B -- Sim --> C[Processa normalmente]
    B -- Não --> D[Retorna 400 Bad Request com detalhes]

🧠 Tratamento Global de Exceções

Important

Em vez de espalhar try/catch por todo o código, usamos um @RestControllerAdvice — uma classe central que captura exceções de toda a aplicação.

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<String> tratarValidacao(MethodArgumentNotValidException ex) {
        return ResponseEntity.badRequest().body("Dados inválidos: " + ex.getMessage());
    }
}

📝 Exercícios Progressivos

  1. Básico: O que faz a anotação @NotBlank?
  2. Básico: Para que serve @Valid no parâmetro de um método do Controller?
  3. Intermediário: Qual a vantagem de usar @RestControllerAdvice em vez de try/catch em cada método?
  4. Intermediário: Qual Status Code HTTP costuma ser retornado quando a validação falha?
  5. Desafio: Adicione as anotações @Email e @Size(min=8) a uma entidade Usuario (campos email e senha).

🚀 Mini-projeto: Adicione validações (@NotBlank, @Positive) à entidade Produto e crie um GlobalExceptionHandler que retorne uma mensagem amigável quando a validação falhar.