Boa tarde, tudo certo?? Bem, na minha aplicação estou fazendo um validador de NIS, porém, não estou obtendo muito sucesso. Tem várias maneiras de fazê-lo e estou vendo no momento qual a melhor. De início estou fazendo o seguinte: criei duas classes Nis.validator e Nis.converter e nelas estou fazendo as validações necessárias. Porém, não estou conseguindo fazer com que retorne a validação correta mesmo. O meu método validaNIS está em loop, e não estou conseguindo arrumar. Abaixo as classes:
Nis.validator:
import java.util.ResourceBundle;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
@FacesValidator(value = "validator.NisValidator")
public class NisValidator implements Validator {
@Override
public void validate(FacesContext arg0, UIComponent arg1, Object valorTela) throws ValidatorException {
if (!validaNIS(String.valueOf(valorTela)) && !valorTela.equals("")) { // && !valorTela.equals("") passa a ser não obrigatório
FacesMessage message = new FacesMessage();
message.setSeverity(FacesMessage.SEVERITY_ERROR);
message.setSummary(ResourceBundle.getBundle(FacesContext.getCurrentInstance().getApplication().getMessageBundle()).getString("erro.validacao.nis"));
throw new ValidatorException(message);
}
}
private static boolean validaNIS(String nis) {
if (nis == null || nis.length() != 11 || isNISPadrao(nis)) {
return false;
}
try {
Long.parseLong(nis);
} catch (NumberFormatException e) {
return false;
}
return true;
}
/**
*
* @param nis String valor a ser testado
* @return boolean indicando se o usuário entrou com um NIS padrão
*/
private static boolean isNISPadrao(String nis) {
if (nis.equals("11111111111") || nis.equals("22222222222")
|| nis.equals("33333333333")
|| nis.equals("44444444444")
|| nis.equals("55555555555")
|| nis.equals("66666666666")
|| nis.equals("77777777777")
|| nis.equals("88888888888")
|| nis.equals("99999999999")) {
return true;
}
return false;
}
private boolean validaPIS(String strPIS) {
char i, j, somatorio = 0;
char chDigitoVerificador;
char chPISAux;
try {
for (i = 0, j = 4; j >= 2; i++, j--) {
somatorio += ((strPIS.charAt(i) - 0x30) * j);
}
for (j = 9; j >= 2; i++, j--) {
somatorio += ((strPIS.charAt(i) - 0x30) * j);
}
if ((somatorio % 11) < 2) {
chDigitoVerificador = 0;
} else {
chDigitoVerificador = (char) (11 - (somatorio % 11));
}
chPISAux = (char) (chDigitoVerificador + '0');
if (strPIS.charAt(11) == chPISAux) {
return true;
} else {
return false;
}
} catch (Exception e) {
return false;
}
}
}
Nis.converter:
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.FacesConverter;
/**
*
* @author prog8
*/
@FacesConverter(value = "converter.NisConverter")
public class NisConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException {
String nis = value;
if (value != null && !value.equals("")) {
nis = value.replaceAll("\\.", "").replaceAll("\\-", "");
}
return nis;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) throws ConverterException {
String nis = (String) value;
if (nis != null && nis.length() == 11) {
nis = nis.substring(0, 3) + "." + nis.substring(3, 8) + "." + nis.substring(8, 10) + "." + nis.substring(10, 11);
}
return nis;
}
}
E no meu xhtml:
<p:outputLabel value="Identificação social (NIS):" for="identificacaoSocial"/>
<p:inputMask mask="999.99999.99.9" id="identificacaoSocial" required="true" value="#{alunoJsfBean.crudObj.numeroIdentificacaoSocial}" maxlength="14">
<f:converter converterId="converter.NisConverter"/>
<f:validator validatorId="validator.NisValidator"/>
</p:inputMask>
Se aluguém puder ajudar, agradeço mto…Vlw