O que é e como funciona o Hibernate Validator?
O Hibernate Validator é a implementação oficial da especificação Bean Validation (JSR-380), que permite validar dados em Java de forma automática. Ele é amplamente utilizado em aplicações Spring Boot e JPA, garantindo a integridade dos dados antes do processamento.
1. Adicionando o Hibernate Validator ao Projeto
Se você está usando Spring Boot, o Hibernate Validator já vem incluído. Caso contrário, adicione a seguinte dependência ao pom.xml
:
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>8.0.0.Final</version>
</dependency>
<dependency>
<groupId>jakarta.el</groupId>
<artifactId>jakarta.el-api</artifactId>
<version>5.0.0</version>
</dependency>
2. Validando Campos de uma Entidade com Anotações
O Hibernate Validator permite adicionar restrições diretamente em classes Java. Veja um exemplo de validação para um usuário:
import jakarta.validation.constraints.*;
public class Usuario {
@NotNull(message = "O nome não pode ser nulo")
@Size(min = 3, max = 50, message = "O nome deve ter entre 3 e 50 caracteres")
private String nome;
@NotBlank(message = "O e-mail não pode estar vazio")
@Email(message = "Formato de e-mail inválido")
private String email;
@Min(value = 18, message = "A idade mínima é 18 anos")
private int idade;
// Getters e Setters
}
Explicação:
@NotNull
→ Impede valoresnull
.@Size(min, max)
→ Define tamanho mínimo e máximo para strings.@NotBlank
→ Evita strings vazias.@Min
→ Define um valor mínimo permitido.
3. Validando Dados em um Controller
No Spring Boot, a validação ocorre automaticamente ao usar a anotação @Valid
:
import jakarta.validation.Valid;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/usuarios")
public class UsuarioController {
@PostMapping
public ResponseEntity<String> criarUsuario(@Valid @RequestBody Usuario usuario) {
return ResponseEntity.ok("Usuário válido: " + usuario.getNome());
}
}
Se um usuário tentar enviar um e-mail inválido ou um nome muito curto, a API retornará um erro automático.
4. Capturando Erros de Validação Personalizados
Para personalizar a resposta de erro, crie um Handler de Exceções:
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
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 ValidacaoHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, String>> handleValidationErrors(MethodArgumentNotValidException ex) {
Map<String, String> erros = new HashMap<>();
ex.getBindingResult().getFieldErrors().forEach(error ->
erros.put(error.getField(), error.getDefaultMessage())
);
return new ResponseEntity<>(erros, HttpStatus.BAD_REQUEST);
}
}
Explicação:
- Intercepta erros de validação automaticamente.
- Retorna um JSON com os campos inválidos e suas mensagens de erro.
5. Validações Personalizadas com @Constraint
Se precisar de uma regra específica, crie uma anotação customizada:
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.*;
@Documented
@Constraint(validatedBy = ValidadorSenha.class)
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface SenhaSegura {
String message() default "A senha deve ter pelo menos 8 caracteres, incluindo números e letras";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Agora, implemente o validador:
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
public class ValidadorSenha implements ConstraintValidator<SenhaSegura, String> {
@Override
public boolean isValid(String senha, ConstraintValidatorContext context) {
return senha != null && senha.matches("^(?=.*[0-9])(?=.*[a-zA-Z]).{8,}$");
}
}
Agora, adicione a anotação @SenhaSegura
na classe Usuario
:
@SenhaSegura
private String senha;
Conclusão
O Hibernate Validator permite validar dados de forma simples e eficiente em aplicações Java. Ele é amplamente utilizado no Spring Boot para garantir a integridade das informações enviadas pelos usuários. Além disso, permite personalizações com validadores específicos para diferentes regras de negócio.
Por que usar o Hibernate Validator para validação de dados em Java?
A validação de dados é essencial para garantir a integridade e a segurança das aplicações Java. O Hibernate Validator, baseado na especificação Bean Validation, oferece uma solução robusta para evitar inconsistências nos dados enviados por formulários e APIs REST. Ele reduz a necessidade de verificações manuais e melhora a experiência do usuário ao fornecer mensagens de erro claras e padronizadas.
Algumas aplicações:
- Validação automática de formulários em aplicações web
- Garantia de integridade de dados em APIs REST
- Redução de código repetitivo em validações manuais
- Melhoria da segurança contra entrada de dados mal formatados
Dicas para quem está começando
- Use
@Valid
no Controller para ativar a validação automaticamente - Evite
@NotNull
em IDs gerados automaticamente - Crie validadores personalizados para regras específicas
- Use um
@RestControllerAdvice
para personalizar respostas de erro
Contribuições de Rodrigo Farias