Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
10
respostas

Desenvolvimento Java Web com VRaptor 4 - Dúvida Injeção de Dependencias

Meu CDI não está conseguindo criar meu EntityManager, na classe ProdutoDao eu peço o EntityManager no construtor e anoto o método com @Inject, criei um método padrão com em(null), criei uma classe Producer, no caso EntityManagerProducer e criei uma método que retorna um EntityManager criando pelo JPAUtil.criaEntityManager e anotei o método com @Produces mas na hora de levantar o servidor ele dá o mesmo erro que aparece no vídeo, o que estou fazendo de errado?

10 respostas

A minha classe Produces que devia passar aos Injects não surtem efeito.

Não entendi o em(null). Você poderia colocar as classes aqui?

Seguinte

fiz a injeção na ProdutoController

public class ProdutoController{
private final ProdutoDao dao;

        @Inject
    public ProdutoController(ProdutoDao dao){
        this.dao = dao;

    }

// fiz um construtor default com null como diz a CDI

public ProdutoController(){
        this(null);

    }
}

Na classe ProdutoDao fiz a injeção e um construtor default

public class ProdutoDao{
private final EntityManager em;

        @Inject
    public ProdutoDao(EntityManager em) {
        this.em = em;
    }

public ProdutoDao(){
        this(null);
    }
}

Como ele precisa criar o EntityManager criei a classe, que chama o método da JPAutil

public class EntityManagerProducer{
        @Produces
    public EntityManager ciraEM(){
        return JPAUtil.criaEntityManager();
    }
}

Segundo a CDI toda vez que um método precisar contruir um objeto do tipo EntityManager deve procurar as classes com @Produces, mas isso não acontece e da esse erro

Unsatisfied dependencies for type EntityManager with qualifiers @Default
  at injection point [BackedAnnotatedParameter] Parameter 1 of [BackedAnnotatedConstructor] @Inject public br.com.caelum.vraptor.dao.ProdutoDao(EntityManager)
  at br.com.caelum.vraptor.dao.ProdutoDao.<init>(ProdutoDao.java:0)

Olá Guilherme! Não custa nada eu perguntar se você já experimentou fazer undeloy do aplicação e depois realizar o deploy novamente no servidor para verificar se realmente ele assumiu sua última alteração. Tente pelo menos uma vez para termos certeza que não é o server passando uma perna na gente, rs. :) Abraço!

Flavio, me desculpe a ignorância, mas poderia fazer um passo a passo comigo, pois como estou iniciando os estudos tenho dúvida de como começar esse processo!

Olá Guilherme, como você está usando um projeto com Maven acredito que este não seja o problema. Mas verifique para mim se o pacote da anotação @Produces é javax.enterprise.inject.Produces e que você não importou outra anotação sem querer.

Flávio me atentei a isso várias vezes quando refiz o método, vendo se estava importando da classe certo e sim

olha ai a classe inteira

package br.com.caelum.vraptor.util;

import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;


public class EntityManagerProducer {

    @Produces
    public EntityManager ciraEM(){
        return JPAUtil.criaEntityManager();
    }

}
solução!

Ola Guilherme! Remove desse package que vai funcionar. O pacote br.com.caelum.vraptor.util é reservado do VRaptor, todas as classes dele não são gerenciadas pelo CDI. Abraço

Olá Guilherme? A dica do Rodrigo funcionou? Se funcionou, não deixe de dar os créditos à ele marcando sua resposta como solucionadora!

Abraço!

Funcionou sim, eu acabei de testar!

Obrigado Rodrigo e a você Flavio, pela atenção, forte abraço!