Gente, o tópico é antigo, mas hoje, após alguns anos afastado da programação web, voltei a uma equipe de programação, fui criar um novo projeto utilizando o bom e velho PrimeFaces e, adivinha? Caí no mesmo probema de vocês… de novo! Mas logo eu me lembrei do porque o diabo do actionListener não disparava o evento. Como sei que esse é um problema ETERNO e, já salvando outros programadores que acessarem este antigo tópico, vamos dar um RESPAWN nele bem a la DESTINY! A explicação é um pouco cumprda:
O maior problema desses erros de envio de formulário é que eles são silenciosos. Ou seja, não é que não disparou o evento actionListener. Na verdade disparou, mas deu pau no meio do caminho e você nem notou, porque o botão simplesmente não faz nada. Alguém aí mencionou que se botar immediate=true, funciona. O immediate=true faz com que o processamento do JSF pule a etapa de validação dos campos, assim como ele vai pular a atribuição dos valores dos campos de formulário aos beans que você referenciou nas tags value para recebê-los. Ou seja, nenhum bean recebe valor nenhum que foi digitado pelo usuário. Por isso que funciona! Porque é justamente aí que está o pau: nos campos do teu formulário, que têm algum erro! Este simples código aqui que usei funcionou perfeitamente, veja só:
code
<p:column>
<p:selectOneMenu value="#{centralTelefonicaMB.consultaParametros.centralTelefonica1.placaIcip}" style=“width: 200px; text-align: center”>
<f:selectItem itemValue=“todos” itemLabel="----- Todos -----" />
<f:selectItem itemValue=“0” itemLabel=“Não” />
<f:selectItem itemValue=“1” itemLabel=“Sim” />
</p:selectOneMenu>
</p:column>
</p:row>
</p:panelGrid>
<p:commandButton actionListener="#{centralTelefonicaMB.geraConsultaCustomizada()}" value=“Gerar Relatório” style=“margin-top: 20px” />
</p:outputPanel> [/code]
E no managed bean:
public final void geraConsultaCustomizada(){
if(consultaTipo.equals("consultaCentral")){
this.consultaTipoExtenso = consultaCentral;
this.consulta = CentralTelefonicaDAO.geraConsultaCustomizadaCentral(consultaTipo, consultaParametros);
}
RequestContext rc = RequestContext.getCurrentInstance();
rc.execute("consultaDialog.show()");
rc.update("f3");
}
Observe que não precisei de ActionEvent, immediate=true, ajax=false, tirar ou colocar parênteses no método do listener, usar h:commandButton, trocar actionListener por action, nada disso!
O que pode ter gerado erro no código de vocês é:
1 - Uma coisa que temos sempre que ter em mente é que o campo retornado de um formulário precisa ser, NECESSARIAMENTE, um String. Portanto, se você colocou na tag value de algum campo do formulário um atributo int do teu bean recebendo aquele campo, vai dar pau. Se o dado que vai entrar pelo formulário é um número, coloque um atributo String no teu bean e depois converta lá no teu Managed Bean, por exemplo, assim:
bean1.campo1 = Integer.parseInt(bean1.campo1Str);
- Onde campo1 é o int que será guardado no bean e campo1Str é a variável temporária que guardará o String que vem do formulário. Coloque na cabeça: valor que vem do formulário é sempre String. Portanto, o atributo do bean que recebe aquele valor tem que ser String também.
2 - Um erro clássico que dá pau em envio de formulário é esquecer de instanciar os campos do formulário na inicialização do bean. Por exemplo: se o inputText tem seu value="#{managedBean.objeto1.campo1"}", mas o objeto1 não foi instanciado no managed bean antes de você clicar no submit do formulário, vai rolar null pointer exception. Porque a primeira coisa que o JSF faz quando você submete o formulário é mandar um managedBean.getObjeto1(). Aí dá pau. No meu caso, dava pau porque havia um objeto dentro do outro. Meu Managed Bean tinha um objeto consultaParametros, e este, por sua vez tinha um objeto do tipo CentralTelefonica nele. Eu instanciei o consultaParametros, mas não instanciei o objeto centralTelefonica. Aí, quando JSF tentou acessar o objeto, deu o maldito null pointer exception.
A solução mais simples para se inicializar atributos que receberão dados do formulário é no próprio método get do atributo, lá no ManagedBean:
Ao invés de:
[code]publicpublic TuplaRelatorio getConsultaParametros() {
return consultaParametros;
}[/code]
Coloque:
[code]publicpublic TuplaRelatorio getConsultaParametros() {
if(this.consultaParametros == null)
consultaParametros = new TuplaRelatorio();
return consultaParametros;
}[/code]