Ordem de renderização JSF ( ciclo de vida )[RESOLVIDO]

7 respostas
daviddjp

Galera,

tenho o seguinte problema.

Acesso um web service e tenho que capturar uma exceção quando ele está indisponível.
Capturo a exceção e lanço uma mensagem na tela.

O problema é que esse web service popula uma combo e a tag <h:messages> está acima desse código, dessa forma:

<div align="center">
        <h:messages globalOnly="true" styleClass="obrigatorio"/>
</div>

<f:selectItems value="#{visao.estados}" />

O que acontece é que o JSF já renderizou o h:messages quando chega na combo ( já esta na fase Render Response ) ai entao ele chama meu método e o método lanca a mensagem na tela. Como ele já carregou o h:messages a mensagem nao aparece.

Se eu faco isso :

<f:selectItems value="#{visao.estados}" />

<div align="center">
        <h:messages globalOnly="true" styleClass="obrigatorio"/>
</div>

A mensagem aparece.

Deu para entender?

Alguma solução que não seja mudar a posição do h:messages?

7 Respostas

tnaires

Pelo que vejo, você escreveu em seu managed bean um método chamado getEstados(), e é dentro dele que você adiciona a mensagem caso algo dê errado não é?
Nesse caso, você tem que mover essa lógica para outro local. O ideal é que, quando a fase Render Response for executada pelo JSF, a lista de estados já tenha sido carregada, ou a mensagem já tenha sido lançada.

daviddjp

É isso mesmo cara… agora como eu vou popular a combo em um momento diferente ?

E no caso da mensagem é dificil mexer tambem porque eu lanço a mensagem dentro de um bloco catch.

tnaires

Você pode escrever um método no managed bean que será executado antes da página ser renderizada. Esse método será executado na fase Invoke Application.
Esse método executa o web service e armazena os dados em uma lista, declarada como variável de instância no managed bean. O seu getter retornará essa lista simplesmente.
Caso haja algum erro a mensagem pode ser lançada nesse mesmo método também.

daviddjp

Entendi. Acho que assim vai funcionar mesmo!

Voei! heheh… vou testar

daviddjp

É cara…funcionou.

Coloquei num método init, que é chamado pelo menu para carregar a lista da combo.

O problema é que são 3 combos, e uma depende da outra.

Uf, municipio e bairro. Para uf ta beleza…

Só que como as outras só aparecem dependendo da primeira, complicou um pouco.

Pensando em alguma solução aqui.

tnaires

Agora você precisa escrever dois value change listeners:

  • um que será executado quando o estado for selecionado, e será responsável por carregar a lista de municípios;
  • outro que será executado quando o município for selecionado, e será responsável por carregar a lista de bairros.
daviddjp

Cara blza… funcionou bacana! percebi que ele vai na valueChange antes de atualizar o modelo… ficou massa.

Parou de funcionar o caso de uso auiehauieha, mas isso tá funcionando.

Muito código sinistro aqui, to mudando quase tudo.

Valeu!!!

Flw

Criado 8 de julho de 2010
Ultima resposta 8 de jul. de 2010
Respostas 7
Participantes 2