[RESOLVIDO] Primefaces: Listener em p:selectOneMenu só é startado na segunda mudança

Companheiros,

já li trocentos relatos de problemas com listeners em p:selectOneMenu do primefaces, onde o método do listener simplesmente não é invocado quando se muda o valor do selectOneMenu. Mas o meu caso eu nunca vi nada igual. O Listener é invocado na mudança de item de menu, mas SOMENTE DA SEGUNDA VEZ EM DIANTE. Colocando no depurador, percebi que, na primeira vez em que mudo o valor do select, o método do listener nem sequer é chamado, como se eu não tivesse feito nada. Aí, quando tento UMA SEGUNDA VEZ, aí sim, o método é chamado e funciona perfeitamente a partir daí. Se alguém tiver uma luz de como eu faço pra ele invocar o método já no primeiro clique no select, eu ficaria muito agradecido.

Meu form:

<form id="f3"> <p:selectOneMenu value="#{classificacaoMB.periodo}" style="width: 207px" > <f:selectItems value="#{classificacaoMB.periodos}" /> <p:ajax event="change" listener="#{classificacaoMB.valueChangeListener}" update="f2" /> </p:selectOneMenu> </form>

Meu listener, lá no managed bean:

public void valueChangeListener(){ classificaGecex(); }

Talvez importe saber como classificacaoMB.periodos é gerado lá no DAO:

while(rs.next()){ mes = rs.getInt("mes"); switch(mes){ case 1: mesStr = "Janeiro"; break; case 2: mesStr = "Fevereiro"; break; case 3: mesStr = "Março"; break; case 4: mesStr = "Abril"; break; case 5: mesStr = "Maio"; break; case 6: mesStr = "Junho"; break; case 7: mesStr = "Julho"; break; case 8: mesStr = "Agosto"; break; case 9: mesStr = "Setembro"; break; case 10: mesStr = "Outubro"; break; case 11: mesStr = "Novembro"; break; case 12: mesStr = "Dezembro"; break; } ano = rs.getString("ano"); periodos.add(new SelectItem(rs.getString("Periodo"), mesStr + "/" + ano)); }

Lembrando que não uso nenhum tipo de submit ou qualquer navegação de página a página. Os dados são atualizados via ajax, e o formulário “F2” é perfeitamente atualizado ao mudar o valor do select PELA SEGUNDA VEZ EM DIANTE.

Já tentou colocar um PhaseListener do JSF para ver em qual fase do ciclo de vida do JSF sua requisição chega na primeira vez que seleciona?
Já verificou no console do browser utilizando firebug ou ferramenta para desenvolvedor web do chrome, ie, etc. Para ver se a requisição é disparada quando seleciona um valor na primeira vez?

O problema está exatamente no ciclo de vida do managed bean. Coloquei um breakpoint em “setPeriodo(String periodo)”, que é o método do managed bean que recebe o valor do select. Quando vou rodar, ele não aciona o setPeriodo na primeira vez, só na segunda em diante. Coloquei o selectOneMenu dentro de um output panel e coloquei update=“panel3,f2” na tag do ajax listener (conforme abaixo), para que o select atualizasse a si mesmo após eu selecionasse qualquer valor dele. Ele simplesmente volta para o valor original, não se atualiza quando eu escolho qualquer opção da primeira vez. Da segunda em diante, aí sim, ele atualiza o próprio valor e atualiza o formulário perfeitamente.

<form id="f3"> <p:outputPanel id="panel3"> <p:selectOneMenu value="#{classificacaoMB.periodo}" style="width: 207px" > <f:selectItems value="#{classificacaoMB.periodos}" /> <p:ajax listener="#{classificacaoMB.valueChangeListener}" update="panel3,f2" /> </p:selectOneMenu> </p:outputPanel> </form>

Lembrando que meu mb tem escopo “session”, e, tanto o “período” (valor que é selecionado pelo select) quanto o “períodos” (arraylist com os períodos disponíveis) são carregados no construtor do mb, conforme abaixo. Não sei se isto influencia.

public ClassificacaoMB() { this.periodos = ClassificacaoDAO.consultaPeriodos(); this.periodo = ClassificacaoDAO.periodoMaisRecente(); }

AAAAAAAAAA DESCOBRI!!!
Um erro estúpido!

Não é , e sim <h:form id=“f3”>, ANTA!!! Aí foi só mudar a referência do formulário f2 no ajax update para :f2 e tudo funcionou lindamente!!! Que coisa!
O código do form f3 ficou assim:

<h:form id="f3"> <p:outputPanel id="panel3"> <p:selectOneMenu value="#{classificacaoMB.periodo}" style="width: 207px" > <p:ajax listener="#{classificacaoMB.valueChangeListener}" update=":f2" /> <f:selectItems value="#{classificacaoMB.periodos}" /> </p:selectOneMenu> </p:outputPanel> </h:form>

Valeu pela ajuda, Guilherme_costa!