Como validar CNPJ alfanumérico em Java
Classe utilitária pronta em Java para validar o novo CNPJ alfanumérico e calcular os dígitos verificadores, com exemplo de Bean Validation no Spring Boot.
Saber como validar CNPJ alfanumérico em Java é essencial para preparar seus sistemas antes de julho de 2026, quando a Receita Federal começa a emitir o novo CNPJ com letras nas 12 primeiras posições. Aqui você recebe uma classe utilitária pronta — com validação e cálculo dos dígitos verificadores — e ainda um exemplo de Bean Validation para Spring Boot.
O que muda no CNPJ alfanumérico
O novo formato, definido pela Instrução Normativa RFB nº 2.229/2024, mantém as 14 posições e a mesma máscara XX.XXX.XXX/XXXX-DD. A diferença é que as posições 1 a 12 (raiz + ordem) passam a aceitar letras maiúsculas A–Z além dos dígitos 0–9; os dois dígitos verificadores (posições 13–14) continuam numéricos. Os CNPJs numéricos atuais não mudam e seguem válidos, convivendo com os novos — seu código precisa aceitar os dois. Veja o panorama completo no nosso guia de implementação do CNPJ alfanumérico.
Validando CNPJ alfanumérico em Java
A classe abaixo é autocontida e sem dependências externas: usa apenas java.util.regex.Pattern. Ela normaliza a entrada (remove máscara e força maiúsculas), valida o formato, descarta a base zerada e confere os dígitos verificadores. Os pesos do módulo 11 são 5,4,3,2,9,8,7,6,5,4,3,2 para o primeiro DV e 6,5,4,3,2,9,8,7,6,5,4,3,2 para o segundo.
import java.util.regex.Pattern;
public final class CnpjAlfanumerico {
private static final int[] PESO1 = {5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2};
private static final int[] PESO2 = {6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2};
private static final Pattern FORMATO = Pattern.compile("[A-Z0-9]{12}[0-9]{2}");
private static String normalizar(String s) {
return s.toUpperCase().replaceAll("[^A-Z0-9]", "");
}
private static int digito(String base, int[] pesos) {
int soma = 0;
for (int i = 0; i < base.length(); i++) {
soma += (base.charAt(i) - 48) * pesos[i];
}
int resto = soma % 11;
return resto < 2 ? 0 : 11 - resto;
}
public static String calcularDV(String base12) {
int d1 = digito(base12, PESO1);
int d2 = digito(base12 + d1, PESO2);
return "" + d1 + d2;
}
public static boolean validar(String cnpj) {
String c = normalizar(cnpj);
if (!FORMATO.matcher(c).matches()) return false;
if (c.substring(0, 12).matches("0{12}")) return false;
return calcularDV(c.substring(0, 12)).equals(c.substring(12));
}
}Use assim: CnpjAlfanumerico.validar("12.ABC.345/01DE-35") retorna true, e CnpjAlfanumerico.calcularDV("12ABC34501DE") retorna "35". A classe é final e só expõe métodos estáticos — perfeita para reaproveitar em qualquer camada.
Calculando os dígitos verificadores
O método calcularDV recebe as 12 primeiras posições (a base) e devolve os dois dígitos. Internamente, digito() percorre cada caractere, converte para o valor numérico (charAt(i) - 48), multiplica pelo peso correspondente e soma tudo. O resto da divisão por 11 define o DV: se for menor que 2, o dígito é 0; caso contrário, é 11 - resto. O segundo dígito reaproveita a base concatenada com o primeiro DV, exatamente como no CNPJ numérico tradicional — só o conjunto de caracteres aceitos mudou.
Usando como Bean Validation no Spring Boot
Para validar campos de DTOs e entidades de forma declarativa, crie uma anotação @CnpjAlfanumerico e um ConstraintValidator que delega para o método estático acima. Assim a regra fica em um único lugar e o framework cuida do resto.
import jakarta.validation.Constraint;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import jakarta.validation.Payload;
import java.lang.annotation.*;
@Documented
@Constraint(validatedBy = CnpjAlfanumericoValidator.class)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface CnpjAlfanumerico {
String message() default "CNPJ inválido";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
class CnpjAlfanumericoValidator
implements ConstraintValidator<CnpjAlfanumerico, String> {
@Override
public boolean isValid(String valor, ConstraintValidatorContext ctx) {
if (valor == null || valor.isBlank()) return true; // use @NotBlank à parte
return CnpjAlfanumerico.validar(valor);
}
}Como testar
- Copie a classe
CnpjAlfanumericoe chamevalidar()com ou sem máscara. - Confirme que
calcularDV("12ABC34501DE")devolve"35". - Garanta que CNPJs numéricos antigos continuam válidos.
- Gere massa de teste com o nosso gerador de CNPJ alfanumérico e confira no validador de CNPJ alfanumérico.
Use os vetores abaixo nos seus testes unitários (JUnit). Todos foram conferidos:
| CNPJ | Tipo | Esperado |
|---|---|---|
12.ABC.345/01DE-35 | Alfanumérico (filial) | válido |
XP.TO1.234/0001-20 | Alfanumérico (matriz) | válido |
9F.8E7.D6C/0001-36 | Alfanumérico (matriz) | válido |
A1.B2C.3D4/E5F6-68 | Alfanumérico (filial) | válido |
2W.7H9.KQ5/R3T8-19 | Alfanumérico | válido |
11.222.333/0001-81 | Numérico clássico | válido |
12.ABC.345/01DE-34 | DV incorreto | inválido |
Perguntas frequentes
Posso continuar usando minha validação atual de CNPJ em Java?
Não inteiramente. A lógica do módulo 11 é a mesma, mas se o seu código usa apenas dígitos (por exemplo, Integer.parseInt ou regex \d sobre as 12 primeiras posições), ele vai rejeitar os novos CNPJs com letras. Troque a conversão por charAt(i) - 48 e aceite [A-Z0-9] na base.
Preciso mudar o tipo da coluna no banco e nos meus DTOs?
Sim. O CNPJ deve ser tratado como String em Java e como texto (VARCHAR(14) sem máscara) no banco. Campos int/long ou colunas inteiras quebram com letras. Normalize sempre para maiúsculas antes de gravar.
O exemplo de Spring Boot funciona com Jakarta Validation e javax?
O exemplo usa jakarta.validation (Spring Boot 3+). Em projetos legados com Spring Boot 2.x, troque os imports jakarta.* por javax.*; o restante da lógica permanece idêntico.
Veja também as versões irmãs deste tutorial: como validar CNPJ alfanumérico em C#/.NET e como validar CNPJ alfanumérico em Python.
Fontes: Receita Federal (IN RFB 2.229/2024) e nota técnica do Serpro sobre o CNPJ alfanumérico.
Ofertas em destaque
Ver todas →
Shopee
-56%
Calça Pantalona Lanzinha Feminina Cintura Alta Com Elastico De e Bolso Outono / Inverno Promoção
Amazon
-14%
Lenços Umedecidos Huggies Rosto e Corpo Limpeza 4 x 48 Un
Shopee
-60%
Brow Rise Gel Para Sobrancelhas By Ruby Rose Linha Rosa HB-E2503 Hot Sale
Amazon
-27%
Hellmann's Maionese Light 500g
Amazon
-93%
Tramontina Ducha Elétrica 3 Temperaturas 5500 W 127 V Chuveiro Branco
Mercado Livre
-20%
Malbec Pure Gold O Boticário Desodorante Colônia Perfume Masculino Original 100ml
Mercado Livre
Perfume Lattafa Bade'e Al Oud For Glory Edp Spray 100 Ml
Mercado Livre
Jaqueta Masc. Sarja Capuz Broken Rules 510075 Preto M Lisa
Mercado Livre