Validando CPF/CNPJ na mesma variável com Bean Validation
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.”