Solucionado (ver solução)
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!