Como validar CPF com JSF?

Olá pessoal,

Gostaria de saber como posso criar minhas validações personalizadas … No eu utilizo o

<h:inputtext value="#{pessoa.cpf}" required="true" requiredMessage="CPF INVALIDO" />

Mas isso só verifica se está em branco ou não …

Então ai está minha dúvida como posso validar esse campo? Ou se eu tivesse um campo de e-mail por exemplo?

Obrigado pessoal …

vc vai ter que criar um validator ou vc tbm pode usar java script para isso,para email o tomahalk tem um componente pronto, flw t+

vc pode ter um método validador no seu ManagedBean, criar um validator próprio, etc…

Tem algum tutorial para indicar?

Obrigado

http://java.sun.com/javaee/5/docs/tutorial/doc/bnauw.html

Eu sugiro

http://stella.caelum.com.br/index.html

Com expressões regulares.

Concordo !

regex só vai validar se o campo está preenchido corretamente não se o CPF é válido, como disseram o correto seria criar um validator

Esqueci de mencionar…se for JSF 2 para fazer com Bean Validation!!

Segue o código de Validação de CPF, de acordos com os princípios da receita federal.

/* 
 * IFPA - Instituto Federal de Educação, Ciência e Tecnologia do Pará - Pólo de Tucumã 
 * Tecnologia de Análise e Desenvolvimento de Sistemas 
 * TAC - Trabalho Acadêmico de Conclusão 
 */  
  
  
/** 
 * @author Anderson Marques Neto 
 * Matrícula: 200879217 - Turma: C791UE (A) - E-mail: [url="mailto:andersonneto@msn.com"]andersonneto@msn.com[/url] 
 */  
public class ValidarCPF {  
  
    /** Realiza a validação do CPF. 
     * 
     * @param   strCPF número de CPF a ser validado 
     * @return  true se o CPF é válido e false se não é válido 
     */  
    public boolean CPF(String strCpf) {  
        if (strCpf.equals("")) {  
            return false;  
        }  
        int d1, d2;  
        int digito1, digito2, resto;  
        int digitoCPF;  
        String nDigResult;  
  
        d1 = d2 = 0;  
        digito1 = digito2 = resto = 0;  
  
        for (int nCount = 1; nCount < strCpf.length() - 1; nCount++) {  
            digitoCPF = Integer.valueOf(strCpf.substring(nCount - 1, nCount)).intValue();  
  
            //multiplique a ultima casa por 2 a seguinte por 3 a seguinte por 4 e assim por diante.  
            d1 = d1 + (11 - nCount) * digitoCPF;  
  
            //para o segundo digito repita o procedimento incluindo o primeiro digito calculado no passo anterior.  
            d2 = d2 + (12 - nCount) * digitoCPF;  
        }  
  
        //Primeiro resto da divisão por 11.  
        resto = (d1 % 11);  
  
        //Se o resultado for 0 ou 1 o digito é 0 caso contrário o digito é 11 menos o resultado anterior.  
        if (resto < 2) {  
            digito1 = 0;  
        } else {  
            digito1 = 11 - resto;  
        }  
  
        d2 += 2 * digito1;  
  
        //Segundo resto da divisão por 11.  
        resto = (d2 % 11);  
  
        //Se o resultado for 0 ou 1 o digito é 0 caso contrário o digito é 11 menos o resultado anterior.  
        if (resto < 2) {  
            digito2 = 0;  
        } else {  
            digito2 = 11 - resto;  
        }  
  
        //Digito verificador do CPF que está sendo validado.  
        String nDigVerific = strCpf.substring(strCpf.length() - 2, strCpf.length());  
  
        //Concatenando o primeiro resto com o segundo.  
        nDigResult = String.valueOf(digito1) + String.valueOf(digito2);  
  
        //comparar o digito verificador do cpf com o primeiro resto + o segundo resto.  
        return nDigVerific.equals(nDigResult);  
    }  
    /* Use este trecho para testar a classe 
    public static void main(String[] args) { 
    System.out.println( CPF("04624193806") ); 
    } 
     */  
}  

dae pessoal, como faço pra chamar essa classe no meu inputText ?

agradecido !

[quote=gustavo_l_walker]Eu sugiro

http://stella.caelum.com.br/index.html[/quote]

Vc só vai precisar de alguns jars e uma anotação :slight_smile:

funcionou mas os cpfs com digitos iguais ex(11111111111) passam. Tem ideia de como posso arrumar isso ?

Valeu

tambem vai funcionar com 22222222222.
basta vc verificar se todos os numeros sao iguais.

Conseguiu amigo fazer o CPF?

Eu tambem estou com o mesmo problema "/

De chamar a função ou de verificar se os digitos são iguais?

Se for a segunda é só fazer um método que vai de char em char, e se o char atual for diferente do anterior, sai da validação.

Pra fechar o forum , eu consegui com a contagem e os numeros.

Tem 3 afazeres: uma classe , o input para validar e o config jsf

Classe para validar as contagens dos digitos

package br.com.duxsolutions.validadores;

import java.util.InputMismatchException;
import java.util.ResourceBundle;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

import br.com.duxsolutions.bean.ClienteBean;

public class CpfValidator implements Validator {
	
	@Override
	public void validate(FacesContext arg0, UIComponent arg1, Object valorTela)
			throws ValidatorException {
		
		valorTela = remove(String.valueOf(valorTela));
		
		if( validaCPF(String.valueOf(valorTela)) != true){
			FacesMessage message = new FacesMessage();
			message.setSeverity(FacesMessage.SEVERITY_ERROR);
			message.setSummary("CPF INVÁLIDO");
		
			throw new ValidatorException(message);
		}
	}
	
	private static boolean validaCPF(String CPF){
		
		if (CPF.equals("00000000000") || CPF.equals("11111111111") ||
	        CPF.equals("22222222222") || CPF.equals("33333333333") ||
	        CPF.equals("44444444444") || CPF.equals("55555555555") ||
	        CPF.equals("66666666666") || CPF.equals("77777777777") ||
	        CPF.equals("88888888888") || CPF.equals("99999999999") ||
	        CPF.length() != 11 || CPF.length() == 14 ){
	   
	    	return(false);
	    }else{
	    
		    char dig10, dig11;
		    int sm, i, r, num, peso;
		 
		// "try" - protege o codigo para eventuais erros de conversao de tipo (int)
		    try {
		// Calculo do 1o. Digito Verificador
		      sm = 0;
		      peso = 10;
		      for (i=0; i<9; i++) {             
		// converte o i-esimo caractere do CPF em um numero:
		// por exemplo, transforma o caractere '0' no inteiro 0        
		// (48 eh a posicao de '0' na tabela ASCII)        
		        num = (int)(CPF.charAt(i) - 48);
		        sm = sm + (num * peso);
		        peso = peso - 1;
		      }
		 
		      r = 11 - (sm % 11);
		      if ((r == 10) || (r == 11))
		         dig10 = '0';
		      else dig10 = (char)(r + 48); // converte no respectivo caractere numerico
		 
		// Calculo do 2o. Digito Verificador
		      sm = 0;
		      peso = 11;
		      for(i=0; i<10; i++) {
		        num = (int)(CPF.charAt(i) - 48);
		        sm = sm + (num * peso);
		        peso = peso - 1;
		      }
		 
		      r = 11 - (sm % 11);
		      if ((r == 10) || (r == 11))
		         dig11 = '0';
		      else dig11 = (char)(r + 48);
		 
		// Verifica se os digitos calculados conferem com os digitos informados.
		      if ((dig10 == CPF.charAt(9)) && (dig11 == CPF.charAt(10))){
		 
		         return true;
		      } 
		      else {
		 
		    	  return(false);
		      } 
	    } catch (InputMismatchException erro) {
	    
	        return(false);
	    }
		    
	    }
	}
	public static String remove(String CPF){
		  CPF = CPF.replace(".", "");
		  CPF = CPF.replace("-", "");
		
		  return CPF;
	  }
	
}

Configuração no Faces-Config

<validator>
  <validator-id>CpfValidator</validator-id>
  <validator-class>br.com.duxsolutions.validadores.CpfValidator</validator-class>
 </validator>
 <validator>
  <validator-id>CnpjValidator</validator-id>
  <validator-class>br.com.duxsolutions.validadores.CnpjValidator</validator-class>
 </validator>

por ultimo a validacao no XHTML ,

<p:inputMask
      id="cliente-cpf"
      value="#{clienteBean.cliente.cpf}"
      mask = "999.999.999-99"
      size="16">
          <f:validator validatorId="CpfValidator"/>
          <p:ajax event="blur" update="cadastroCliente" listener="#{clienteBean.verificaCpfExistente}" />
</p:inputMask>

Esse seu primeiro if é gambiarra, faça como falei anteriormente que fica mais elegante.

public static boolean isRepetidos(String cpf){
	for (int i = 1; i < cpf.length(); i++){
		 if(cpf.charAt(i) != cpf.charAt(i-1)){
			 return false;
		 }
	}
	return true; 
}

Outra também é para deixar só os numeros do CPF, removendo a mascara:

cpf = cpf.replaceAll("[^0123456789]", "");