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;
}
}