O que é e como funciona o Hibernate Validator?

O Hibernate Validator é a implementação padrão da especificação Bean Validation, permitindo validar dados automaticamente em aplicações Java.

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 valores null.
  • @Size(min, max) → Define tamanho mínimo e máximo para strings.
  • @NotBlank → Evita strings vazias.
  • @Email → Valida formato de e-mail.
  • @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.

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

Compartilhe este tutorial: O que é e como funciona o Hibernate Validator

Compartilhe este tutorial

Continue aprendendo:

Como configurar e usar Thymeleaf no Spring Boot

Thymeleaf é um motor de templates para Spring Boot que permite renderizar páginas HTML dinâmicas diretamente do backend.

Tutorial anterior

Como configurar logs em uma aplicação Spring Boot

Os logs no Spring Boot permitem monitorar e depurar aplicações, utilizando SLF4J e Logback para registrar eventos e erros.

Próximo tutorial