1
resposta

Outra forma de usar Validators JSF.

Na parte de validação, expecificamente no LivroBean, temos um método que corresponde a um validador, segue:

public void comecaComDigitoUm(FacesContext fc, UIComponent component,
            Object value) throws ValidatorException {

        String valor = value.toString();
        if (!valor.startsWith("1")) {
            throw new ValidatorException(new FacesMessage(
                    "ISBN deveria começar com 1"));
        }

    }

onde usamos esse validador diretamente no <h:inputText /> através do atributo validator. Porém, usando essa abordagem, caso ocorra a necessidade de usar esse validador em outras telas, será necessário replicar essa validação em outros beans, ou referenciar esse bean em outras telas, perdendo então o lado semântico.

o JSF disponibiliza uma forma de cadastrar nossos validadores sem a necessidade de um bean:

Através da inteface javax.faces.validator.Validator, podemos implementar o método validate; depois precisamos dar um identificador para nosso validador, para que possamos recupera-lo nas nas nossas páginas pela tag <f:validator />

segue o exemplo:

@FacesValidator("br.com.caelum.livraria.validator.ComecaComDigitoUmValidator")
public class ComecaComDigitoUmValidator implements Validator {

    public void validate(FacesContext arg0, UIComponent arg1, Object value) throws ValidatorException {

    String valor = value.toString();

    if (!valor.startsWith("1")) {
        throw new ValidatorException(new FacesMessage(
            "ISBN deveria começar com 1"));

    }
    }

}

e no nosso xhtml:

<h:inputText id="isbn" value="#{livroBean.livro.isbn}">
                               <f:validator validatorId="br.com.caelum.livraria.validator.ComecaComDigitoUmValidator" />
                        </h:inputText>

O uso dos validadores em beans é mais indicado nos casos em que queremos um comportamento bem específico para aquela página em questão, vale avaliar se nosso validador pode ser usado em outra tela, se sim, é mais recomendado externaliza-lo em outra classe.

Valeu pessoal. Obrigado.

1 resposta

Show Yure, obrigado por compartilhar (=

Abraço!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software