JSF - reRender

Boa tarde, galera.

Estou com um problema ao usar o reRender via a4j.

Tenho uma página que tem um radio para Tipo de Pessoa (Pesso Física ou Pessoa Jurídica). No onclick do radio faço um ajax para um actionListener que
carrega combos diferentes em função do radio selecionado. Ao clicar no radio de Pessoa Física eu carrego uma combo de produtos e ao clicar no radio Pessoa Jurídica eu carrego uma combo de Contratos.

O cliente solicitou que não esteja marcada nenhuma das duas opções do radio forçando sua seleção posteriormente. O que acontece com esta abordagem é que o idPanelGroupCoordenacaoLabelInferior e idPanelGroupPostoLabelInferior não são renderizados ao entrar na primeira vez. Os componentes não existirão na página ao serem carregados. Somente aparecem quando o usuário seleciona o radio e via ajax as coisas acontecem.

Até aí funciona perfeitamente através do reRender do a4j. As combos são carregadas e apresentadas com sucesso: ora a combo de produtos ora a combo de contratos.

Porém, quando clico no botão inserir para gravar os dados do formulário o valor da combo escolhida (ou de contrato ou de produtos) não chega ao ManagedBean. Chega null.

Acredito que ao dar reRender o componente não está atualizado a árvore de componentes, mas não estou conseguindo corrigir.

Alguém pode ajudar?

<h:selectOneRadio id="idRadio" value="#{pessoaManagedBean.tipoPessoa}" > <f:selectItem itemLabel="Pessoa Fisica" itemValue="F"/> <f:selectItem itemLabel="Pessoa Juridica" itemValue="J"/> <a4j:support event="onclick" actionListener="#{pessoaManagedBean.teste}" reRender="idPanelGroupLabelSuperior, idPanelGroupComboSuperior" /> </h:selectOneRadio>

<h:panelGroup id="idPanelGroupLabelSuperior"> <h:panelGroup id="idPanelGroupCoordenacaoLabelInferior" rendered="#{pessoaManagedBean.tipoPessoa eq 'F'}"> <h:selectOneMenu value="#{pessoaManagedBean.pessoa.produto}" converter="longConverter" > <f:selectItems value="#{pessoaManagedBean.produtoList}" /> </h:selectOneMenu> </h:panelGroup> <h:panelGroup id="idPanelGroupPostoLabelInferior" rendered="#{pessoaManagedBean.tipoPessoa eq 'J'}"> <h:selectOneMenu value="#{pessoaManagedBean.pessoa.contrato}" converter="longConverter" > <f:selectItems value="#{pessoaManagedBean.contratoList}" /> </h:selectOneMenu> </h:panelGroup> </h:panelGroup>

Brow se sua bean for request vc perde os valores q foram atribuidos aos atributos do bean.

sugiro que adicione a annotation @keepAlive no seu bean ;D

kritiuns não é uma questão de request/session.

Mas só para desencargo de consciência fiz o teste colocando em sessão. Não funcionou.

Se eu deixar os combos serem renderizados (sem o rendered do idPanelGroupCoordenacaoLabelInferior e do idPanelGroupPostoLabelInferior) os componentes são montados na página e ao cilcar no botão inserir os seus valores chegam no ManagedBean com sucesso.

Agora quando estes componentes estão indisponíveis ao renderizar a página a primeira vez (ou seja, não existirem) eles parecem não montarem na árvores de componentes ao serem re-renderizados pelo ajax. Logo ao tentar capturá-lo no lado ManagedBean ao clicar no botão inserir parece que os componentes não existem, por isso null.

Fiz um teste que é exibir o código-fonte (do brownser) após a página ser carregada.

  1. Se eu deixar os combos serem renderizados (sem o rendered do idPanelGroupCoordenacaoLabelInferior e do idPanelGroupPostoLabelInferior) os componentes aparecem no código-fonte (do brownser)

  2. Se mantiver os combos com rendered os componentes não aparecem no código-fonte (do brownser)

ola