JSF 2.0 + Primefaces

2 respostas
nel

Bom dia a todos.

Surgiu uma dúvida. Até o momento trabalhava com versão anterior a do JSF 2.0, e iniciei o processo agora no JSF 2.0 com o primefaces, já utilizei richfaces e icefaces.
Bom, lembro-me que com o richfaces e o JSF anterior a 2.0, era possível criar um validator para um determinado campo, depois configura-lo no faces-config.xml e implementar a interface Validator do Faces.

Então, eu fiz exatamente isso e ele lança, inclusive, a exceção “ValidatorException” e apresenta a mensagem de erro na tela, como deveria fazer. Até aí, tudo 100%.
O problema, é que pelo o que eu tenho conhecimento, quando esta exceção é lançada em um validator, a mesma “encerra o ciclo de vida do JSF”, ou seja, não permite que a aplicação chegue até o server. Estou errado?

Digo, pois, quando clico no botão de pesquisa, eu quero que ele faça a validação e se houver a exceção, ele não chegue ao método do server, mas infelizmente, ele lança a exceção e continua processando. O Managed Bean é do tipo Session e estou adicionando o f:validator em dois campos h:inputText e o botão que aciona o Managed Bean é um p:commandButton (primefaces).

Alguém saberia me informar o que posso estar fazendo de errado e uma possível solução?!
Obrigado á todos!

Abraços.

2 Respostas

JavaFXMan

Olá meu caro, e então, tudo blz? O que está acontecendo é que, possivelmente, você não está lançando a exceção. Eu fiz o seu exemplo usando JSF2 e vou colocar logo abaixo:

Validator

@FacesValidator(value="validaCredCard")
public class ValidaCartaoCredito implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        String numeroCartao = (String) value;
        if(numeroCartao.length() < 14){
            throw new ValidatorException(new FacesMessage("Número de Cartão inválido"));
        } else {
            context.addMessage(component.getClientId(), new FacesMessage("Esse cartão é válido"));
        }
    }
}

Como estamos usando JSF2, não é necessário que façamos uso do arquivo faces-config para registrar o novo Validator.

Controller / ManagedBean

@ManagedBean
public class ControllerTeste {

    public ControllerTeste() {
    }

    public void executa(){
        System.out.println("Isso não pode ser executado se estourar uma ValidatorException");
    }
}
A pagina JSF
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.prime.com.tr/ui">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <h:inputText validator="validaCredCard" />
            <h:commandButton action="#{controllerTeste.executa}" value="Executa Método" />
        </h:form>
    </h:body>
</html>

É isso.

Espero ter ajudado.
Abraços.

nel

Olá! Tudo bem?
Antes de mais nada, muito obrigado pela força!

Na realidade, o que eu fiz está correto. Sou novo no produto e então precisei conversar com outras pessoas para saber algumas regras de negocios, tem bastante javascript e era um destes que estava chamando um método em comum com o meu Managed Bean. Ele realmente não chama o meu bean, como é o correto.

Mas eu utilizei o f:validator, não sabia desse annotation do JSF 2.0, extramemente interessante!!!
Muito obrigado pela dica e ajuda amigo!

Abraços.

Criado 17 de fevereiro de 2011
Ultima resposta 17 de fev. de 2011
Respostas 2
Participantes 2