Validando CPF/CNPJ na mesma variável com Bean Validation

Gilson Silva
Blog Gilson Silva TI
3 min readAug 10, 2020

Olá pessoALL, tudo bem!

Já conhecem o Bean Validation?

Bean Validation é uma especificação que permite validar objetos com facilidade em diferentes camadas da aplicação. A vantagem é que as restrições ficam inseridas nas classes de modelo. Iremos utilizar Hibernate Validator, que é a implementação de referência.

Temos nossa classe Cliente, reparem que existe apenas uma variável para CPF e CNPJ, é muito comum nos nossos projetos.

Se deixarmos nossa classe dessa forma, só será validado um, provavelmente CPF, então vamos à solução que por incrível que pareça será bem simples:

Notem que adicionamos o parâmetro groups em cada anotação:

  • @CPF(groups = CpfGroup.class);
  • @CNPJ(groups = CnpjGroup.class).

Calma, não se assustem! São duas interfaces simples e sem nenhuma implementação, será apenas para identificarmos qual será a validação utilizada pelo Bean Validation, pois desse modo ele saberá exatamente se deve validar CPF ou CNPJ.

public interface CpfGroup {}public interface CnpjGroup {}

Adicionaremos elas em nosso enum TipoPessoa:

Chegou o grande momento, o pulo do gato, é agora que ensinaremos ao Bean Validation quem ele tem que validar: CPF ou CNPJ. Adicionei uma anotação (@GroupSequenceProvider) a nível de classe passando como parâmetro a classe (ClienteGroupSequenceProvider) que iremos construir, será bem simples também.

Criando agora a classe ClienteGroupSequenceProvider que foi passada como parâmetro com a anotação @GroupSequenceProvider. Ela também será bem simples, só tem duas observações:

  • Implementar a interface DefaultGroupSequenceProvider<T> passando Cliente;
  • Implementar o método obrigatório getValidationGroups.
  • Na primeira linha do método que estamos sobrescrevendo instanciamos uma lista;
  • Na segunda linha adicionamos nossa classe Cliente para não perdermos as outras anotações do Bean Validation;
  • Depois é só fazer uma pequena verificação para evitarmos NullPointerException e etc;
  • Por fim, pegamos o grupo do cliente que é selecionado em nosso formulário (Física ou Jurídica) e pronto, nossa implementação se encarregará do restante.

Bem simples não é?! ;-)

“Essa implementação pode ser usada em qualquer projeto Java que esteja fazendo uso de Bean Validation. Bom é isso.”

Abraços e fiquem todos com Deus! LinkedIn e GitHub!!!

--

--

Gilson Silva
Blog Gilson Silva TI

Engenheiro de Software na CI&T | Bacharel em Sistemas de Informação | Programador Apaixonado