[RESOLVIDO] Injetar EntityManager no Converter

8 respostas
jpajsfcdi
M

Utilizo JSF2.2, CDI1.2 e gostaria de saber como resolver o problema de acessar um EntityManager no Converter JSF para fazer um consulta.

Eu injeto meu o contexto de persistência assim:

@PersistenceContext(name = "UnidadePersistenciaDaAplicacao")
private EntityManager manager;

Já anotei a classe que implementa Converter com @Named, já tentei injetar o manager direto no converter, nada disso funcionou. Inclusive fiz esse exemplo:
https://stackoverflow.com/questions/26328869/accessing-the-entitymanager-from-a-jsf-converter-class

8 Respostas

Mike

Deu alguma exceção?

Para a sua classe funcionar, ela precisa apenas ser anotada com @FacesConverter e implementar Converter (como ja fez)

M

O problema não é esse, o converter funciona. O problema é pegar o EntityManager no Converter. NullPointerException.

darlan_machado

Sinceramente, eu não gosto desta abordagem. Converter é converter, não tem que fazer acesso a banco de dados, isso é tarefa para uma classe específica.
Eu sugiro que você injete a classe que utiliza para realizar consultas no converter e faça a consulta por ela.

M

darlan_machado, já estou pensando dessa forma. Será que na documentação não tem algo parecido? acho que até quebra o modelo MVC para solicitar dados e retornos direto no Model.

darlan_machado

Quebra o MVC sim.

cassunde

Fala @Mathiasr temos que separar as responsabilidades, temos que ter uma camada exclusiva para acesso aos dados, eu faria da seguinte forma, teria um dao específico desse seu objeto, que seria responsável por obter esse objeto de várias formas, inclusive da forma que vc vai precisar no converter.

public class PessoaDao{
    
    @PersistenceContext(name = "UnidadePersistenciaDaAplicacao")
    private EntityManager manager;
  

    public Pessoa obterPessoaPorCodigo(Integer id){
         //query para obter uma pessoas através do seu id
        return manager.createQuery()
    }

}

seu converter era para ficar mais ou menos assim:

@FacesConverter(forClass=Pessoa.class, value="pessoaConverter")
public class PessoaConverter implements Converter {
	
	@Inject
	private PessoaDao dao;

	@Override
	public Object getAsObject(FacesContext context, UIComponent component, String value) {
		return dao.obterPessoaPorId(new Integer(value));
	}

	@Override
	public String getAsString(FacesContext context, UIComponent component, Object value) {
		if (value instanceof Projeto) {
			Pessoa pessoa = (Pessoa) value;
			return String.valueOf(pessoa.getId());
		}
		
		return "";
	}
}

Quando em uma classe existe um objeto injetado nulo e muito provável que essa classe não esteja no contexto da CDI ou a CDI não soube criar a instância do atributo injetado, no caso do entityManager deve existir um produces ensinando a CDI como criar-lo

M

O problema é injetar

@Injectprivate PessoaDao dao;

isso não funciona! Mas resolvi não fazer isso no Converter, acredito que quebra a estrutura MVC do projeto.

Mike

Funciona, mas depende de como esta o seu PessoaDao

Criado 29 de maio de 2018
Ultima resposta 4 de jul. de 2018
Respostas 8
Participantes 4