Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

JSF sobre PhaseListener e chamadas de métodos nos Beans

Olá. Isso não chega a ser um problema mas uma dúvida sobre os caminhos que o jsf escolhe. Eu tenho alem de marcar os PhaseListener marcado todo método com uma assinatura unica sysout para saber quando e se foi chamado e me intriguei vendo que o jsf chama alguns métodos várias vezes durante algumas requisições em que deveria ser uma apenas. ex na tela de Autor com console em branco quando clico em por exemplo alterar algum autor na lista o console mostra o seguinte.

FASE: RESTORE_VIEW 1
FASE: APPLY_REQUEST_VALUES 2
carregando autores
carregando autores
carregando autores
FASE: PROCESS_VALIDATIONS 3
carregando autores
carregando autores
carregando autores
FASE: UPDATE_MODEL_VALUES 4
carregando autores
carregando autores
carregando autores
FASE: INVOKE_APPLICATION 5
carregando autores
carregando autor
FASE: RENDER_RESPONSE 6
carregando autores
carregando autores
carregando autores

Minha classe AutorBean:

@ManagedBean
@ViewScoped
public class AutorBean {

    private Autor autor = new Autor();

    public Autor getAutor() {
        return autor;
    }
    public void gravar() {
        System.out.println("Gravando autor " + this.autor.getNome());
        if(autor.getId()==null)
            new DAO<Autor>(Autor.class).adiciona(this.autor);
        else
            new DAO<Autor>(Autor.class).atualiza(autor);

        autor = new Autor();
    }
    public List<Autor> getAutoresCadastrados() {
        System.out.println("carregando autores");
        return new DAO<Autor>(Autor.class).listaTodos();
    }
    public void excluirAutor(Autor autor) {
        System.out.println("excluindo autor");
        new DAO<Autor>(Autor.class).remove(autor);
    }
    public void carregarAutor(Autor autor) {
        System.out.println("carregando autor");
        this.autor=autor;
    }
    public void imprimirMensagem() {
        System.out.println("imprimindo mensagem botão teste");
    }
}

Não entendo o ciclo dessas chamadas, alguem sabe explicar?

2 respostas

Se for necessário aqui o xhtml autor:

........
        <h:form>
            <fieldset>
                <legend>Dados do Autor</legend>
                <h:panelGrid columns="2">
                    <h:outputLabel value="Nome:" for="nome" />
                    <h:inputText id="nome" value="#{autorBean.autor.nome}" 
                        required="true" requiredMessage="Nome do autor deve ser preenchido">
                        <f:validateLength minimum="5" />
                    </h:inputText>    
                    <h:commandButton value="Gravar" action="#{autorBean.gravar}" />
                    <h:commandButton value="Botao Teste" action="#{autorBean.imprimirMensagem}"/>
                </h:panelGrid>
                <h:messages id="menssagens"/>
            </fieldset>
        </h:form>
    <h:form> 
        <fieldset>
            <legend>Autores Cadastrados</legend>    
            <h:dataTable id="tabelaAutores" value="#{autorBean.autoresCadastrados}" var="autor" rendered="true">
                <h:column>
                    <f:facet name="header"> Nome </f:facet>
                    <h:outputText value="#{autor.nome}"/>
                </h:column>
                <h:column>
                    <f:facet name="header"> Excluir </f:facet>
                    <h:commandLink value="Excluir" action="#{autorBean.excluirAutor(autor)}" />
                </h:column>
                <h:column>
                    <f:facet name="header"> Alterar </f:facet>
                    <h:commandLink value="Alterar" action="#{autorBean.carregarAutor(autor)}" />
                </h:column>
            </h:dataTable>
        </fieldset>
    </h:form>
..........
solução!

É que ele sempre acessa as informação do seu ManagedBean através dos getters... O número de vezes que ele chama, é algo específico da implementação, não tem uma explicação exata. O melhor, como trabalhado no curso, é nunca deixar nada pesado(consultas ao banco) dentro desses métodos, a não ser que você trate para só ser executada na primeira invocação.