Como validar o body de uma requisição com Spring Boot
Aprenda a validar dados no Spring Boot! Veja como fazer a validação de forma eficiente, centralizando regras e garantindo mais segurança para sua aplicação. Evite dados inválidos e torne seu backend mais confiável.

Quando estamos desenvolvendo APIs com o Spring Boot, uma das primeiras coisas que precisamos fazer é garantir que os dados recebidos nas requisições sejam válidos antes de processá-los.
1. Pré-requisitos para esse artigo
Nesse artigo estou considerando que você já tenha um projeto inicial em Spring Boot e conhecimento básico de Java.
2. Breve resumo
Sempre que desenvolvemos APIs precisamos transitar os dados de forma consistente desde o recebimento até todo processamento na camada de negócio. Nesse contexto começaremos a falar das DTOs (Data Transfer Objects) e a validação dos dados.
3. O que é um DTO?
DTO é um objeto que usamos para transferir dados entre a camada de apresentação (front-end ou consumidores da API) e a camada de negócios, onde de fato o processamento ocorre.
Por exemplo. ao receber uma requisição para cadastrar um novo cliente, com login e senha, você jamais vai passar diretamente o objeto da entidade (modelo) diretamente para camada de controle. Ao invés disso, você criará uma DTO que definirá os dados e como eles serão validados. Parece confuso, mas chegaremos ao código que é muito mais simples do que pensamos.
4. Vamos ao código
Para facilitar usaremos a biblioteca Lombok para reduzir o código boilerplate (código repetitivo e desnecessário) gerando automaticamente getters/setters.
4.1. Criação da DTO
import lombok.Data;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Size;
@Data
public class LoginDTO {
@NotEmpty(message = "Preencha o campo e-mail.")
@Email(message = "Digite um e-mail válido.")
private String email;
@Size(min = 6, max = 20, message = "A senha deve ter pelo menos 6 caracteres e no máximo 20.")
private String password;
}
Nesse exemplo vamos considerar que os dados que estamos recebendo serão usados para logar em um sistema. Usaremos validações como @NotEmpty
, @Email
e @Size
, que são fornecidas pelo Spring para podermos validar que os dados estão no formato correto. A anotação @Data
é da biblioteca Lombok para gerar os getters/setters automaticamente.
4.2. Configuração do Controlador (Controller)
import <SEU NAMESPACE>.features.Login.DTO.LoginDTO;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.*;
import org.springframework.http.MediaType;
@RestController
public class LoginController {
@PostMapping(value = "/auth", produces = MediaType.APPLICATION_JSON_VALUE)
public String auth(@Valid @RequestBody LoginDTO loginDTO) {
return "Usuário autenticado com sucesso!";
}
}
Perceba que a anotação chave aqui é @Valid
aplicada ao LoginDTO
no método auth
. Quando o Spring receber a requisição, automaticamente validará os dados que vierem no corpo da requisição com as anotações definidas na DTO. Caso algum dado seja inválido, um BAD REQUEST (400) será gerado como resposta a requisição (exemplo abaixo).
{
"timestamp": "2025-03-10T12:34:56.789+00:00",
"status": 400,
"error": "Bad Request",
"errors": [
{
"field": "email",
"message": "Digite um e-mail válido."
},
{
"field": "password",
"message": "A senha deve ter pelo menos 6 caracteres e no máximo 20."
}
],
"path": "/auth"
}
4.3. Personalizando o retorno de erro
Você pode personalizar esse retorno de acordo com as necessidades da sua aplicação. Veja como é simples.
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.http.HttpStatus;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ControllerAdvice
public class DataErrHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ResponseEntity<Map<String, List<String>>> handleValidationExceptions(MethodArgumentNotValidException ex) {
List<String> errors = ex.getFieldErrors().stream()
.map(DefaultMessageSourceResolvable::getDefaultMessage)
.toList();
return ResponseEntity.badRequest().body(Map.of("errors", errors));
}
}
Nesse caso eu optei em trazer um JSON com um array de erros.
{
"errors": [
"Digite um e-mail válido.",
"A senha deve ter pelo menos 6 caracteres e no máximo 20."
]
}
5. Conclusão
O Spring Boot possui muitas funcionalidades já abstraídas que facilita o dia a dia do desenvolvedor. No artigo em tela, verifica-se que o retorno padrão 400 atende a maioria das aplicações para validação de dados. Caso precise adaptar e customizar o retorno, a implementação é bem simples.