JSF - Ciclo de vida sendo realizado duas vezes

0 respostas
E

Olá galera, estou realizando uma aplicação usando JSF, estou usando uma PhaseListener p/ fazer o controle de Sessions da minha aplicação.
O problema é que o meu ciclo está sendo executado duas vezes, e eu sempre faço um commit na sessão depois da fase RENDER_RESPONSE; logo, fica mostrando um erro no console do eclipse:

Bom, vamos ao código que fica mais facil de entender.

eu tenho a classe ListenerFasesJSF, responsável por controlar as minhas sessions
package com.perfaco.controller;

import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;

import org.hibernate.Session;

import com.perfaco.hibernate.HibernateUtil;

public class ListenerFasesJSF implements PhaseListener {

	
	public void beforePhase(PhaseEvent fase) {
		//MOSTRA A FASE DO CICLO
		System.out.println("antes Fase: "+fase.getPhaseId());
		if(fase.getPhaseId().equals(PhaseId.RESTORE_VIEW)){
			Session session = HibernateUtil.getSession().openSession();
			session.beginTransaction();
			FacesContextUtil.setRequestSession(session);
		}
		
	}

	public void afterPhase(PhaseEvent fase) {
		//MOSTRA A FASE DO CICLO
		System.out.println("DEPOIS Fase: "+fase.getPhaseId());
		if(fase.getPhaseId().equals(PhaseId.RENDER_RESPONSE)){
			Session session = FacesContextUtil.getRequestSession();
			try{
				 session.getTransaction().commit();
			}catch(Exception e){
				 System.out.println("Erro no commit da transação");
				 System.out.println(e.getMessage());
				 if(session.getTransaction().isActive()){
					 session.getTransaction().rollback();
				 }
				
			}finally{
				session.close();
			}
			

		}
	}

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

}
Criei uma FacesContextUtil para auxiliar o controle de sessões.
package com.perfaco.controller;

import javax.faces.context.FacesContext;

import org.hibernate.Session;

public class FacesContextUtil {
	private static final String HIBERNATE_SESSION = "hibernate_session";
	
	public static void setRequestSession(Session session){
		FacesContext.getCurrentInstance().getExternalContext().getRequestMap().put(HIBERNATE_SESSION, session);
	}
	
	
	public static Session getRequestSession(){
		return (Session) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get(HIBERNATE_SESSION);
	}

}
E por fim, um BackingBean que tem apenas 1 método para me retornar uma lista de fornecedores:
package com.perfaco.controller;

import java.util.ArrayList;
import java.util.List;

import javax.faces.model.SelectItem;

import org.hibernate.Session;

import com.perfaco.DAO.HibernateDAO;
import com.perfaco.DAO.InterfaceDAO;
import com.perfaco.view.Fornecedor;

public class EntradaProdutoBackingBean {
	
	
	public List<SelectItem> getFornecedores(){
		Session session = FacesContextUtil.getRequestSession();
		InterfaceDAO<Fornecedor> fornecedorDAO = new HibernateDAO<Fornecedor>(Fornecedor.class, session);
		List<Fornecedor> fornecedores = fornecedorDAO.getBeans();
		List<SelectItem> selectFornecedor = new ArrayList<SelectItem>();
		for(Fornecedor fornecedor: fornecedores){
			selectFornecedor.add(new SelectItem(fornecedor.getIdFornecedor().toString(), fornecedor.getNome()));
		}
		return selectFornecedor;
	}
	
}
Aqui está a minha página JSP
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="f"  uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h"  uri="http://java.sun.com/jsf/html"%>
<%@ taglib prefix="htm" uri="http://jsftutorials.net/htmLib" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Compra de Material</title>
<link rel="stylesheet" href="css/principal.css" type="text/css" /> 
</head>
<body>
<f:view>
<htm:div id="divPrincipal" styleClass="corpoPrincial">
<h1 id="titulo">Compra de Material</h1>
</htm:div>
<htm:div  styleClass="corpoEsquerda">
<fieldset style="borda">
	<legend style="legenda">Fornecedor</legend>
	<h:outputText value="Selecione o fornecedor: "></h:outputText>
	<h:selectOneMenu id="selectFornecedor">
		<f:selectItems value="#{entradaProdutoBackingBean.fornecedores }"/>
	</h:selectOneMenu>
</fieldset>
</htm:div>
</f:view>
</body>
</html>

E o console, reparem que cada fase do ciclo é executado duas vezes:

27/12/2011 10:44:49 org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jre6\bin;.;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Common Files\Roxio Shared\DLLShared\;C:\Program Files (x86)\Common Files\Roxio Shared\12.0\DLLShared\;C:\Program Files (x86)\Windows Live\Shared;C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files\MySQL\MySQL Server 5.5\bin
27/12/2011 10:44:49 org.apache.tomcat.util.digester.SetPropertiesRule begin
AVISO: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:Agenda' did not find a matching property.
27/12/2011 10:44:49 org.apache.tomcat.util.digester.SetPropertiesRule begin
AVISO: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:Perfaco-Web' did not find a matching property.
27/12/2011 10:44:49 org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
27/12/2011 10:44:49 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 436 ms
27/12/2011 10:44:49 org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
27/12/2011 10:44:49 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.32
27/12/2011 10:44:50 com.sun.faces.config.ConfigureListener contextInitialized
INFO: Initializing Mojarra (1.2_15-b01-FCS) for context '/Perfaco-Web'
log4j:WARN No appenders could be found for logger (org.apache.myfaces.webapp.AbstractFacesInitializer).
log4j:WARN Please initialize the log4j system properly.
27/12/2011 10:44:51 org.apache.catalina.core.StandardContext addApplicationListener
INFO: The listener "com.sun.faces.config.ConfigureListener" is already configured for this context. The duplicate definition has been ignored.
27/12/2011 10:44:51 com.sun.faces.config.ConfigureListener contextInitialized
INFO: Initializing Mojarra (1.2_15-b01-FCS) for context '/Agenda'
27/12/2011 10:44:52 org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
27/12/2011 10:44:52 org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
27/12/2011 10:44:52 org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/20 config=null
27/12/2011 10:44:52 org.apache.catalina.startup.Catalina start
INFO: Server startup in 2623 ms
27/12/2011 10:44:55 org.apache.myfaces.trinidadinternal.config.ConfigParser parseConfigFile
INFO: Trinidad está executando em modo de depuração. Não use em um ambiente de produção. Consulte:/WEB-INF/trinidad-config.xml
antes Fase: RESTORE_VIEW 1
antes Fase: RESTORE_VIEW 1
DEPOIS Fase: RESTORE_VIEW 1
DEPOIS Fase: RESTORE_VIEW 1
antes Fase: RENDER_RESPONSE 6
antes Fase: RENDER_RESPONSE 6
Hibernate:
select
this_.idfornecedor as idfornec1_2_2_,
this_.agencia as agencia2_2_,
this_.banco as banco2_2_,
this_.cep as cep2_2_,
this_.contaCorrente as contaCor5_2_2_,
this_.contaPoupanca as contaPou6_2_2_,
this_.logadouro as logadouro2_2_,
this_.nome as nome2_2_,
this_.nomeFantasia as nomeFant9_2_2_,
this_.numero as numero2_2_,
this_.rua as rua2_2_,
this_.telefone as telefone2_2_,
produtos2_.fornecedor_idfornecedor as fornecedor6_4_,
produtos2_.idProduto as idProduto4_,
produtos2_.idProduto as idProduto1_0_,
produtos2_.estoque as estoque1_0_,
produtos2_.fornecedor_idfornecedor as fornecedor6_1_0_,
produtos2_.nome as nome1_0_,
produtos2_.precoCompra as precoCom4_1_0_,
produtos2_.precoVenda as precoVenda1_0_,
produtos2_.unidade_idunidade as unidade7_1_0_,
unidade3_.idUnidade as idUnidade3_1_,
unidade3_.descricao as descricao3_1_
from
fornecedor this_
left outer join
produto produtos2_
on this_.idfornecedor=produtos2_.fornecedor_idfornecedor
left outer join
unidade unidade3_
on produtos2_.unidade_idunidade=unidade3_.idUnidade
DEPOIS Fase: RENDER_RESPONSE 6
DEPOIS Fase: RENDER_RESPONSE 6
Erro no commit da transação
Session is closed!
27/12/2011 10:44:56 com.sun.faces.lifecycle.Phase handleAfterPhase
AVISO: JSF1053: (Listener: com.perfaco.controller.ListenerFasesJSF.afterPhase(), Phase ID: RENDER_RESPONSE 6, View ID: /compra-produto.jsp) Exception thrown during phase-listener execution: org.hibernate.SessionException: Session was already closed
27/12/2011 10:44:56 com.sun.faces.lifecycle.Phase handleAfterPhase
AVISO: org.hibernate.impl.SessionImpl.close(SessionImpl.java:275)
com.perfaco.controller.ListenerFasesJSF.afterPhase(ListenerFasesJSF.java:40)
com.sun.faces.lifecycle.Phase.handleAfterPhase(Phase.java:175)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:114)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:266)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl._invokeDoFilter(TrinidadFilterImpl.java:238)
org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl._doFilterImpl(TrinidadFilterImpl.java:195)
org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl.doFilter(TrinidadFilterImpl.java:138)
org.apache.myfaces.trinidad.webapp.TrinidadFilter.doFilter(TrinidadFilter.java:92)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:147)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:470)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
java.lang.Thread.run(Unknown Source)

Obrigado a todos ;D

Criado 27 de dezembro de 2011
Respostas 0
Participantes 1