Iniciar variável (Entity Manager) de um Managed Bean diretamenta pelo Faces-config.xml

6 respostas
Hromenique
Pessoal, estou com o seguinte problema: Quero iniciar um bean com um objeto EntityManager através do faces-config. Estou usando o padrão Open Session, no qual em um filtro, abro uma transação e passo o objeto EntityManager para o objeto Request. Depois que eu passo via request, eu quero recuperá-lo no Faces-config.xml, para que meu bean seja inicializado com ele. Eu já tentei usar <value>#{requestScope.entityManager}..... <value>#{entityManager.... , mas não tive sucesso. A única maneira com a qual eu conseguir foi diretamente no código do bean:
public CadastroBean() {
		this.usuario = new Usuario();
		HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
		this.manager = (EntityManager) request.getAttribute("entityManager");		
		dao = new UsuarioDAO(manager);		
	}
Gostaria de saber se é possível o mesmo resultado pelo faces-config.xml. Para este projeto estou usando o JSF 1.2. Pesquisando, descobri que usando o JSF 2.0, isso é possível com annotations, mas gostaria de fazer mesmo com JSF 1.2 Seque abaixo meus códigos: [color=red]FILTRO [/color]
package control.filters;

import java.io.IOException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/** 
 * @author Hromenique Cezniowscki Leite Batista</br></br>
 * Filtro que comanda o ciclo de vida de um EntityManager que é passado para as classes de négocios
 *
 */
public class EntityManagerFilter implements Filter {
	
	private EntityManagerFactory factory; 
	
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		EntityManager manager = this.factory.createEntityManager();
		//atributo a ser passado junto com o request
		request.setAttribute("entityManager", manager);
		manager.getTransaction().begin();
		
		chain.doFilter(request, response);
		
		try{
			manager.getTransaction().commit();
		}
		catch (Exception e) {
			manager.getTransaction().rollback();
		}
		finally{
			manager.close();
		}		
	}
	
	public void init(FilterConfig arg0) throws ServletException {
		this.factory = Persistence.createEntityManagerFactory("trab_solucoes_web");
		
	}
	
	public void destroy() {
		this.factory.close();
		
	}
}
[color=red]BEAN [/color]
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletRequest;

import model.dao.classes.UsuarioDAO;
import model.entities.Usuario;

/**
 * @author Hromenique Cezniowscki Leite Batista</br> </br>
 * Classe que desempenha o papel de Managed Bean da página cadastro.xhtml. Responsável pela regras de négocios para cadastro de novos usuários.
 *
 */
public class CadastroBean {

	/*VARIÁVEIS*/
	private EntityManager manager;
	private Usuario usuario;
	private String confirmacaoEmail;
	private String confirmacaoSenha;	
	private UsuarioDAO dao;

	
	/*CONSTRUTORES*/
	public CadastroBean() {
		this.usuario = new Usuario();
		//HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
		//this.manager = (EntityManager) request.getAttribute(&quot;entityManager&quot;);		
		dao = new UsuarioDAO(manager);		
	}
	
	/*MÉTODOS*/
	public void salvar(ActionEvent event){
		//No ínicio o login é igual ao email.
		this.usuario.setLogin(this.usuario.getEmail());
		dao.salvar(this.usuario);
		//return &quot;sucesso&quot;;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public String getConfirmacaoEmail() {
		return confirmacaoEmail;
	}

	public void setConfirmacaoEmail(String confirmacaoEmail) {
		this.confirmacaoEmail = confirmacaoEmail;
	}

	public String getConfirmacaoSenha() {
		return confirmacaoSenha;
	}

	public void setConfirmacaoSenha(String confirmacaoSenha) {
		this.confirmacaoSenha = confirmacaoSenha;
	}

	public UsuarioDAO getDao() {
		return dao;
	}

	public void setDao(UsuarioDAO dao) {
		this.dao = dao;
	}

	public EntityManager getManager() {
		return manager;
	}

	public void setManager(EntityManager manager) {
		this.manager = manager;
	}
}
[color=red]FACES-CONFIG [/color]
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xi="http://www.w3.org/2001/XInclude"
 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-facesconfig_1_2.xsd"&gt;
 
 &lt;application&gt;
  &lt;view-handler&gt;com.sun.facelets.FaceletViewHandler&lt;/view-handler&gt;
 &lt;/application&gt;

 &lt;!-- ####################### BEANS ###################################################################################################### --&gt;
 &lt;managed-bean&gt;
  &lt;managed-bean-name&gt;cadastroBean&lt;/managed-bean-name&gt;
  &lt;managed-bean-class&gt;control.beans.CadastroBean&lt;/managed-bean-class&gt;
  &lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt; 
  
  &lt;managed-property&gt;
  &lt;property-name&gt;manager&lt;/property-name&gt;
  &lt;value&gt;#{requestScope.entityManager}&lt;/value&gt; &lt;!-- AQUI É ONDE EU QUERO INICIAR O BEAN COM OBJETO PASSADO VIA FILTRO, UTILIZANDO INJEÇÃO DE DEPENDÊNCIA --&gt;
  &lt;/managed-property&gt;
 &lt;/managed-bean&gt; 
 &lt;/faces-config&gt;

Abraços

6 Respostas

jv.nicocelli

Hromenique, Bom dia…

Você conseguiu uma solução para isso? Também estou com o problema há algum tempo e não consigo resolver…

Hromenique

Desculpa a demora em responde o tópico.
Então, não conseguir resolver isso ainda.
Como citado na primeira postagem só encontrei uma forma de fazer isso com annotations, usando JSF 2.0.

O mais engraçado, é que teoricamente tudo o que é possível por meio de annotations, deveria ser possível através do faces-config.xml.
Contudo, eu acabei abandonando a idéia de usar Open Session, pois um dos beans tem escopo de sessão e só era possível usar uma única vez e na próxima requisição o bean guardava o estado que o EntityManager estava fechado.

Contudo, mesmo assim estou interessado em saber como fazer esse tipo de injeção de valor através do faces-config para o JSF 1.2.

jv.nicocelli

Hromenique
Como citado na primeira postagem só encontrei uma forma de fazer isso com annotations, usando JSF 2.0.

Você utilizou o Jboss para fazer dessa forma?

Hromenique

Então,
eu retirei essa linha de uma apostila. Até onde me lembro, na apostila eles usavam a implementação Mojarra do JSF, esse tipo de annotation é válida para qualquer implementação do JSF 2.0. Não sei se isso responde a sua pergunta.

jv.nicocelli

Respondeu sim, também ja consegui resolver meu problema.

Obrigado…

L

Olha acho que porque algumas frameworks como o jsf ja cria uma entity manager factory quando voçê usa a anotação @ManagedBean , e não pode haver mais de uma no projeto , isto poque tendo mais de um pode haver uma concorrencia ao ascesso ao banco
então você usa a do próprio framework utilizando a anotação @PersistenceContext

Criado 5 de novembro de 2011
Ultima resposta 22 de ago. de 2013
Respostas 6
Participantes 3