Problemas com @ManagedProperty e com Filtro no JSF 2

Boa Noite gente…

Seguinte…eu to estudando JSF e para praticar estava fazendo um CRUD simples…até ai sem problemas…mas quando eu tentei usar um filtro com o padrão Open Session in View para eu recuperar um EntityManager no meu ManagedBean junto com a anotação @ManagedProperty, a pagina não carrega mais e mostra o seguinte erro:

javax.servlet.ServletException: Não foi possível criar o bean gerenciado usuarioMB. Os seguintes problemas foram encontrados: - A propriedade manager para o bean gerenciado usuarioMB não existe.

Aqui está meu ManagedBean e o Filtro:

package managedbeans;

import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;

import model.Usuario;

@ManagedBean
public class UsuarioMB {
	@ManagedProperty(value="#{entityManager}")
	private EntityManager manager;
	private Usuario usuario;
	
	public UsuarioMB() {
		this.usuario = new Usuario();
	}
	
	public void adiciona() {
		if (usuario.getId() == null)
			manager.persist(this.usuario);
		else
			manager.merge(this.usuario);
		manager.flush();
		this.usuario = new Usuario();
	}

	public void alterar(Usuario usuario) {
		this.usuario = manager.find(Usuario.class, usuario.getId());
	}
	
	public void remove(Usuario usuario) {
		manager.remove(usuario);
		manager.flush();
	}
	
	public List<Usuario> getUsuarios() {
		TypedQuery<Usuario> query = manager.createQuery("SELECT u FROM Usuario as u", Usuario.class);
		return query.getResultList();
	}
	
	public Usuario getUsuario() {
		return usuario;
	}
}
package filtros;

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;
import javax.servlet.annotation.WebFilter;

@WebFilter(servletNames={"Faces Servlet"})
public class FiltroJPA implements Filter {

	private EntityManagerFactory factory;
	
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		this.factory = Persistence.createEntityManagerFactory("cadastro");	
	}
	
	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		
		EntityManager manager = this.factory.createEntityManager();
		request.setAttribute("entityManager", manager);
		manager.getTransaction().begin();
		
		chain.doFilter(request, response);
		
		try {
			manager.getTransaction().commit();
		} catch (Exception e) {
			manager.getTransaction().rollback();
		} finally {
			manager.close();
		}
	}
	
	@Override
	public void destroy() {
		this.factory.close();	
	}
}

Se puderem ajudar eu agradeço…

Abraços

ao invés disso

@ManagedProperty(value="#{entityManager}") private EntityManager manager;

não seria isso

@inject private EntityManager manager;

ou isso

@PersistenceContext private EntityManager manager;

Não tenho certeza.
Abraços

clunsde, obrigado pela ajuda…mas não deu certo o que você falou…

porém pesquisando na internet…eu descobri que para o @ManagedProperty funcionar corretamente com JSF eu precisaria colocar um metodo setter para o meu EntityManager dentro do meu ManagedBean…pelo que eu li é algum problema com Injeção de Dependencia entre o JPA e o JSF…se alguem souber explicar direito o proque eu ficaria grato… :slight_smile:

mas para corrigir o meu problema eu simplesmente coloquei um setter no meu ManagedBean UsuarioMB…

segue o código para quem interessar:

UsuarioMB.java

package managedbeans;

import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;

import model.Usuario;

@ManagedBean
public class UsuarioMB {
	@ManagedProperty(value="#{entityManager}")
	private EntityManager manager;
	private Usuario usuario;
	
	public UsuarioMB() {
		this.usuario = new Usuario();
	}
	
	public void adiciona() {
		if (usuario.getId() == null)
			manager.persist(this.usuario);
		else
			manager.merge(this.usuario);
		manager.flush();
		this.usuario = new Usuario();
	}

	public void alterar(Usuario usuario) {
		this.usuario = manager.find(Usuario.class, usuario.getId());
	}
	
	public void remove(Usuario usuario) {
		manager.remove(usuario);
		manager.flush();
	}
	
	public List<Usuario> getUsuarios() {
		TypedQuery<Usuario> query = manager.createQuery("SELECT u FROM Usuario as u", Usuario.class);
		return query.getResultList();
	}
	
	public Usuario getUsuario() {
		return usuario;
	}
        
        //Setter necessario para a anotação @ManagedProperty Funcionar corretamente =S
	public void setManager(EntityManager manager) {
		this.manager = manager;
	}
}

Valeu pela Ajuda…

Abraços…

Fala Felipe, tudo na paz?

Pelo que eu li, para este tipo de injeção, deve-se fornecer o método setter independente de ser com JPA ou não.

Neste exemplo um ManagedBean é injetado em outro

Cara você salvou minha vida!!! estava com esse erro e não estava conseguindo identificar o problema.

Muito Obrigado.