Jakarta Validation (Bean Validation) no Spring Boot 🚀
O Jakarta Validation, anteriormente conhecido como Bean Validation, é um padrão para validar objetos Java de forma declarativa. Ele permite adicionar restrições diretamente nos atributos de classes, sem necessidade de código manual para verificações.
No Spring Boot, a validação com Jakarta Validation é integrada automaticamente ao Spring MVC e ao Spring Data JPA, facilitando a validação de DTOs (Data Transfer Objects) e entidades.
📌 1. Como Funciona?
Jakarta Validation usa anotações para definir regras de validação diretamente nos atributos de uma classe.
Exemplo de Classe com Validação
import jakarta.validation.constraints.*;
public record AutorRequest(
@NotBlank(message = "O nome é obrigatório")
String nome,
@NotBlank(message = "O email é obrigatório")
@Email(message = "O email deve ter um formato válido")
String email,
@NotBlank(message = "A descrição é obrigatória")
@Size(max = 400, message = "A descrição não pode ter mais de 400 caracteres")
String descricao
) {
public Autor toModel() {
return new Autor(nome, email, descricao);
}
}
O que acontece aqui?
-
@NotBlank
→ Garante que o valor não seja nulo nem vazio. -
@Email
→ Valida se o email tem um formato correto. -
@Size(max = 400)
→ Limita a descrição a 400 caracteres.
Se algum desses critérios não for atendido, o Spring automaticamente retorna 400 Bad Request.
📌 2. Como Ativar a Validação no Spring Boot?
O Spring Boot já possui suporte nativo, mas você deve garantir que a dependência está presente no pom.xml
:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
Agora, no seu Controller, basta usar @Valid
para ativar a validação:
import jakarta.validation.Valid;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/autores")
public class AutorController {
private final AutorService autorService;
public AutorController(AutorService autorService) {
this.autorService = autorService;
}
@PostMapping
public ResponseEntity<Void> cadastrar(@RequestBody @Valid AutorRequest request) {
autorService.cadastrarAutor(request);
return ResponseEntity.ok().build();
}
}
Agora, qualquer requisição inválida será automaticamente rejeitada pelo Spring.
📌 3. Principais Anotações do Jakarta Validation
🛠 Validações Simples
Anotação | Descrição |
---|---|
@NotNull |
Não permite um valor nulo, porém permite um valor vazio. |
@NotEmpty |
Assim como a @NotNull, não permite valor nulo e além disso seu tamanho deve ser maior que zero. Espaços em brancos são levados em conta na verificação de tamanho do valor. |
@NotBlank |
Assim como a @NotEmpty, não permite valor nulo e o comprimento (sem considerar espaços em branco) deve ser maior que zero. |
@Size(min = X, max = Y) |
Define o tamanho mínimo e/ou máximo de um campo String ou List. |
@Email |
Valida se a string tem um formato de email válido. |
@Pattern(regexp = "...") |
Valida se a string segue um padrão regex. |
🛠 Validações Numéricas
Anotação | Descrição |
---|---|
@Positive |
O número deve ser positivo (> 0). |
@PositiveOrZero |
O número deve ser positivo ou zero. |
@Negative |
O número deve ser negativo (< 0). |
@NegativeOrZero |
O número deve ser negativo ou zero. |
@Min(X) |
O número deve ser maior ou igual a X. |
@Max(Y) |
O número deve ser menor ou igual a Y. |
@Digits(integer = X, fraction = Y) |
Define um número com até X casas inteiras e Y casas decimais. |
🛠 Validações Específicas
Anotação | Descrição |
---|---|
@AssertTrue |
O valor deve ser true. |
@AssertFalse |
O valor deve ser false. |
@Future |
A data deve ser no futuro. |
@Past |
A data deve ser no passado. |
📌 4. Personalizando Mensagens de Erro
Você pode personalizar mensagens nas anotações:
@Size(max = 400, message = "A descrição não pode ter mais de 400 caracteres")
private String descricao;
Ou usar um arquivo de mensagens (messages.properties
):
📄 resources/messages.properties
autor.nome.notblank = O nome é obrigatório
autor.email.notblank = O email é obrigatório
autor.email.invalid = O email deve ter um formato válido
autor.descricao.size = A descrição não pode ter mais de 400 caracteres
E no código:
@NotBlank(message = "{autor.nome.notblank}")
private String nome;
📌 5. Tratamento Global de Erros
O Spring Boot retorna um erro padrão, mas você pode criar um Handler Global para personalizar a resposta:
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.RestControllerAdvice;
import java.util.HashMap;
import java.util.Map;
@RestControllerAdvice
public class ValidacaoExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, String>> handleValidationExceptions(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
for (FieldError error : ex.getBindingResult().getFieldErrors()) {
errors.put(error.getField(), error.getDefaultMessage());
}
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errors);
}
}
Agora, se houver erro, a API retorna um JSON estruturado:
{
"nome": "O nome é obrigatório",
"email": "O email deve ter um formato válido",
"descricao": "A descrição não pode ter mais de 400 caracteres"
}
📌 6. Validação Customizada com @Constraint
Se precisar criar uma validação própria, use @Constraint
:
Exemplo: Validar domínio de email
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.*;
@Documented
@Constraint(validatedBy = EmailEmpresaValidator.class)
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface EmailEmpresa {
String message() default "O email deve pertencer ao domínio @empresa.com";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Classe EmailEmpresaValidator
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
public class EmailEmpresaValidator implements ConstraintValidator<EmailEmpresa, String> {
@Override
public boolean isValid(String email, ConstraintValidatorContext context) {
return email != null && email.endsWith("@empresa.com");
}
}
Uso na Classe de Request
@EmailEmpresa
private String email;
Agora, apenas emails @empresa.com
serão aceitos!
📌 Conclusão
✅ Validações declarativas fáceis de usar
✅ Mensagens de erro personalizadas
✅ Tratamento global de erros
✅ Validações customizadas para regras específicas
Com Jakarta Validation, sua API fica mais robusta e segura! 🚀
Para obter mais informações sobre o Jakarta Validation, você pode consultar os seguintes recursos oficiais:
Site Oficial do Jakarta Bean Validation: https://beanvalidation.org/
Especificações do Jakarta Validation: https://jakarta.ee/specifications/bean-validation/
Esses links fornecem acesso à documentação completa, especificações e recursos adicionais para auxiliar no uso do Jakarta Validation em suas aplicações Java.
Top comments (0)