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]
[code]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
- 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();
}
}
[/code]
[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("entityManager");
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 "sucesso";
}
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]
<?xml version="1.0" encoding="UTF-8"?>
<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">
<application>
<view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
</application>
<!-- ####################### BEANS ###################################################################################################### -->
<managed-bean>
<managed-bean-name>cadastroBean</managed-bean-name>
<managed-bean-class>control.beans.CadastroBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>manager</property-name>
<value>#{requestScope.entityManager}</value> <!-- AQUI É ONDE EU QUERO INICIAR O BEAN COM OBJETO PASSADO VIA FILTRO, UTILIZANDO INJEÇÃO DE DEPENDÊNCIA -->
</managed-property>
</managed-bean>
</faces-config>
Abraços