Ciclo de vida do JSF RENDER_RESPONSE 6 não é chamada ... !?

6 respostas
W

Olá a todos,
bem estou quebrando a cabeça aqui pra entender o que que acontece na minha aplicação, eu estou usando o PhaseListener para criar e fechar minhas sessões do hibernate abro uma sessão em beforePhase -> RESTORE_VIEW e fecho a sessão em afterPhase ->RENDER_RESPONSE, e podia jurar de pé junto que iria funcionar perfeitamente … porém depois de um certo ponto no projeto apareceu o tal error "javax.faces.el.EvaluationException: org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
" … então fiz o debug da PhaseListener e já no primeiro link que clico em minha página o console me retorna isso:

Antes da Fase RESTORE_VIEW 1
Antes da Fase RESTORE_VIEW 1
Abriu sessao!!!
Depos da Fase RESTORE_VIEW 1
Antes da Fase APPLY_REQUEST_VALUES 2
Depos da Fase APPLY_REQUEST_VALUES 2
Antes da Fase PROCESS_VALIDATIONS 3
Depos da Fase PROCESS_VALIDATIONS 3
Antes da Fase UPDATE_MODEL_VALUES 4
Depos da Fase UPDATE_MODEL_VALUES 4
Antes da Fase INVOKE_APPLICATION 5
Depos da Fase INVOKE_APPLICATION 5
Antes da Fase RESTORE_VIEW 1
Antes da Fase RESTORE_VIEW 1
Abriu sessao!!!
Depos da Fase RESTORE_VIEW 1
Antes da Fase RENDER_RESPONSE 6
Depos da Fase RENDER_RESPONSE 6
fechou sessao!!!

Pra não ficar solto, o código do meu debug é esse:

public class ListenerFasesHandler implements PhaseListener {

    public void beforePhase(PhaseEvent fase) {
        System.out.println("Antes da Fase " + fase.getPhaseId());
        if (fase.getPhaseId().equals(PhaseId.RESTORE_VIEW)) {
            System.out.println("Antes da Fase " + fase.getPhaseId());
            Session session1 = FacesContextHandler.getRequestSession();
            if (session1 == null) {
                Session session = HibernateUtil.getSessionFactory().openSession();
                System.out.println("Abriu sessao!!!");
                session.beginTransaction();
                FacesContextHandler.setRequestSession(session);
            }
        }
    }

    public void afterPhase(PhaseEvent fase) {

        System.out.println("Depos da Fase " + fase.getPhaseId());
        if (fase.getPhaseId().equals(PhaseId.RENDER_RESPONSE)) {

            Session session = FacesContextHandler.getRequestSession();
            if (session != null) {
                try {
                    System.out.println("fechou sessao!!!");
                    session.getTransaction().commit();
                } catch (Exception e) {
                    if (session.getTransaction().isActive()) {
                        session.getTransaction().rollback();
                    }

                } finally {
                    session.close();

                }
            }
        }
    }

    public PhaseId getPhaseId() {
        return PhaseId.ANY_PHASE;
    }
}

*esse teste:

if (session1 == null)

eu coloquei depois na esperança de fazer alguma diferença ! ^^ … mas enfim …
Realmente não entendo o que que está acontecendo … o link que eu clico é esse :

<rich:menuItem submitMode="ajax" value="Novo usuario" action="novoUsuario" >
pra mim um link normal … tirando que esté link está em um template … estou usando facelets, tem alguma coisa a ver?
Bem antes que alguem venha e coloque este link http://balusc.blogspot.com/2006/09/debug-jsf-lifecycle.html pra eu ler … eu já o li várias vezes ! =)
Mas enfim, continuo não entendendo, alguem tem alguma ideia do que que poder ser ?! De alguma maneira pra evitar isso … !? Qualquer dica vale !
Desde já muito obrigado ! !
Walter

6 Respostas

rponte

Humm…

Posso ver seu web.xml? :slight_smile:

W

olá rafael … segue aqui o meu web.xml, obrigado pela resposta.

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    
    <context-param>
        <param-name>com.sun.faces.verifyObjects</param-name>
        <param-value>false</param-value>
    </context-param>
    
    <context-param>
        <param-name>com.sun.faces.validateXml</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>client</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
        <param-value>.xhtml</param-value>
    </context-param>
    <context-param>
        <param-name>facelets.DEVELOPMENT</param-name>
        <param-value>false</param-value>
    </context-param>
    <context-param>
        <param-name>facelets.SKIP_COMMENTS</param-name>
        <param-value>true</param-value>
    </context-param>

    <filter>
        <display-name>Ajax4jsf Filter</display-name>
        <filter-name>ajax4jsf</filter-name>
        <filter-class>org.ajax4jsf.Filter</filter-class>
    </filter>
    
    <filter-mapping>
        <filter-name>ajax4jsf</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
    </filter-mapping>


    <filter>
        <filter-name>FiltroLogin</filter-name>
        <filter-class>br.com.projeto.Filtros.FiltroLogin</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>FiltroLogin</filter-name>
        <url-pattern>/usuario/*</url-pattern>
    </filter-mapping>


    <filter>
        <filter-name>FiltroGuilda</filter-name>
        <filter-class>br.com.projeto.Filtros.FiltroGuilda</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>FiltroGuilda</filter-name>
        <url-pattern>/guilda/*</url-pattern>
    </filter-mapping>

    
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

    <welcome-file-list>
        <welcome-file>forward.jsp</welcome-file>
    </welcome-file-list>

    <context-param>
        <param-name>org.ajax4jsf.SKIN</param-name>
        <param-value>blueSky</param-value>
    </context-param>
</web-app>

Alguma idéia, nem que seja vaga do que poderia ser ?!
[]´s

W

Nossa gente alguma idéia, ou palpute, desculpa a insistência, mas é que fiquei realmente sem chão agora, li várias coisas, mas nada que falasse alguma coisa que pudesse realmente ajudar.
Agradeço desde já por qualquer dica ou palpite sobre o que que pode causar alguma coisa dessas!
[]´s!

danielbussade

Olá, poderia mostrar o metodo HibernateUtil.getSessionFactory().openSession()?

W

Olá daniel, aqui vai o meu hibernateUtil:

public class HibernateUtil {

    private static final SessionFactory sessionFactory;

    static {
        Configuration configuration = new Configuration();

        sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

Mas as sessões elas estão sendo abertas e fechadas na primeira e na ultima fase do ciclo de vida do jsf … como mostra no meu código da ListenerFasesHandler que está no meu primeiro post.
Só pra complementar …
as sessões são criadas e eu usu pra pegar a sessão essa função aqui:

public static Session getRequestSession() {
        return (Session) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get(HIBERNATE_SESSION);
    }

Você tem alguma idéia do que que pode ser? ou alguma dica do que que posso fazer pra contornar esse problema !?
Obrigado pela ajuda ! :wink:

W

Up! … ninguem ! ?=/

Criado 6 de agosto de 2009
Ultima resposta 10 de ago. de 2009
Respostas 6
Participantes 3