Rich:calendar com rich:ajaxValidator [PROBLEMÃO]

6 respostas
C

Pessoal todos os campos do meu form estão funcionando perfeitamente, exceto o txt_data_nascimento_pf, um rich:calendar. Minha validação não está funcionando. O validator deveria me dizer se o cliente é menor de idade lançar a exceção e o message mostrar o erro, só que só mostra que o cliente é menor de idade mesmo colocando no calendar uma data bem antiga, abaixo segue o código:

//no meu form

                     <h:outputText styleClass="rotulo" value="Data Nascimento*" />
		<rich:message showDetail="false" showSummary="false"
			id="msg_data_nascimento_pf1" for="txt_data_nascimento_pf">
			<a4j:facet name="errorMarker">
				<h:graphicImage value="/imagens/icones/erro.png" width="20"
					height="20" />
			</a4j:facet>
			<f:facet name="infoMarker">
				<h:graphicImage style="" value="/imagens/icones/ok.png" height="20"
					width="20" />
			</f:facet>
		</rich:message>
		<rich:calendar required="true" id="txt_data_nascimento_pf"
			value="#{MBusuarios.usuarios.cpf.dataNascimento}"
			datePattern="dd/MM/yyyy">
			<f:validator validatorId="validator.validatorDataNascimento" />
			<rich:ajaxValidator event="onchanged" limitToList="true" />
			
		</rich:calendar>
		<rich:message id="msg_data_nascimento_pf2"
			for="txt_data_nascimento_pf" />




//meu validator


public class validatorDataNascimento implements Validator {

	@Override
	public void validate(FacesContext arg0, UIComponent component,
			Object valorTela) throws ValidatorException {
		FacesMessage message = new FacesMessage();
		
                              // no if se eu trocar valorTela.toString() por "01/01/1969" por exemplo funciona, o que será??
		if (idade(valorTela.toString(), "dd/MM/yyyy") < 18) {	
			((UIInput) component).setValid(false);
			message.setSeverity(FacesMessage.SEVERITY_ERROR);
			message.setDetail(ResourceBundle.getBundle(
					FacesContext.getCurrentInstance().getApplication()
							.getMessageBundle()).getString(
					"erro.validacao.idade"));
			message.setSummary(ResourceBundle.getBundle(
					FacesContext.getCurrentInstance().getApplication()
							.getMessageBundle()).getString(
					"erro.validacao.idade"));
			throw new ValidatorException(message);
		} else {
			
				((UIInput) component).setValid(true);
				message.setSeverity(FacesMessage.SEVERITY_INFO);
				throw new ValidatorException(message);
			
		}

	}

	public int idade(String dataNascimento, String pattern) {

		DateFormat sdf = new SimpleDateFormat(pattern);
		Date dataNascInput = new Date();
		try {
			dataNascInput = sdf.parse(dataNascimento);
		} catch (Exception e) {
		}
		Calendar dateOfBirth = new GregorianCalendar();
		dateOfBirth.setTime(dataNascInput);
		// Cria um objeto calendar com a data atual
		Calendar today = Calendar.getInstance();
		// Obtém a idade baseado no ano
		int age = today.get(Calendar.YEAR) - dateOfBirth.get(Calendar.YEAR);
		dateOfBirth.add(Calendar.YEAR, age);
		if (today.before(dateOfBirth)) {
			age--;
		}
		return age;

	}
}

6 Respostas

mgarcia

Qual o valor retornado por valorTela.toString()?

C

uma data vida do rich:calendar

C

o método idade executado sozinho me da a idade corretamente por isso acho que o algorítimo esta correto, o problema é que só cai em < que 18 qualquer data que eu colocar no forma

C

form

C

Vou tentar ser mais claro.
O que está acontecendo: no onchange do rich:calendar só aparece o erro ‘cliente menor de idade’, qualquer data que eu selecione

O que eu quero: no onchange apareça uma imagem de ok (que está funcionando nos outros campos) caso o cliente seja maior ou uma mensagem de erro caso seja menor

mgarcia

cara… só por desencargo…faz um System.out.println(valorTela.toString()) e ve o resultado… q era o resultado da tela eu sabia… rs… não testei nenhum dos métodos q vc postou, mas se vc disse q sozinho o método funciona, e q passando o valor na mão tb, o q pode estar errado só pode ser a entrada.

Criado 26 de maio de 2010
Ultima resposta 26 de mai. de 2010
Respostas 6
Participantes 2