Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Injeção de CDI

Bom dia a todos!

Após injetar CDI nas minhas classes AutorDAO, AutorBean, LivroDAO e LivroBean tenho tido os erros conforme abaixo. Segue também parte dos códigos das classes para análise.

Agradeço antecipadamente qualquer apoio na solução deste erro.

Atte.,

Vicente,

Erro apresentado no console do eclipse

GRAVE: A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/livraria]]

Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/livraria]]

Caused by: org.jboss.weld.exceptions.DeploymentException: Exception List with 2 exceptions:
Exception 0 :
org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type EntityManager with qualifiers @Default
  at injection point [BackedAnnotatedField] @Inject br.com.caelum.livraria.dao.AutorDAO.manager
  at br.com.caelum.livraria.dao.AutorDAO.manager(AutorDAO.java:0)

Exception 1 :
org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type EntityManager with qualifiers @Default
  at injection point [BackedAnnotatedField] @Inject br.com.caelum.livraria.dao.LivroDAO.manager
  at br.com.caelum.livraria.dao.LivroDAO.manager(LivroDAO.java:0)

Parte da classe AutorBean

package br.com.caelum.livraria.bean;

import java.io.Serializable;
import java.util.List;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import br.com.caelum.livraria.dao.AutorDAO;
import br.com.caelum.livraria.modelo.Autor;
import br.com.caelum.livraria.util.RedirectView;


@Named 
@ViewScoped // javax.faces.view.ViewScoped
public class AutorBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private Autor autor = new Autor();
    private Integer autorId;

    @Inject
    AutorDAO autorDao;

    public List<Autor> getAutores() {
        return autorDao.listaTodos();
    }

Restante do código omitido

Parte da classe AutorDAO

package br.com.caelum.livraria.dao;

import java.io.Serializable;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.persistence.EntityManager;

import br.com.caelum.livraria.modelo.Autor;

@SuppressWarnings("serial")
public class AutorDAO implements Serializable {

    @Inject
    EntityManager manager;

    private DAO<Autor> autorDao;

    @PostConstruct
    void init() {
        this.autorDao = new DAO<Autor>(this.manager, Autor.class);
    }

    public void adiciona(Autor t) {
        autorDao.adiciona(t);
    }

Restante do código omitido

Parte da classe LivroBean

package br.com.caelum.livraria.bean;

import java.io.Serializable;
import java.util.Arrays;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;

import br.com.caelum.livraria.dao.AutorDAO;
import br.com.caelum.livraria.dao.LivroDAO;
import br.com.caelum.livraria.modelo.Autor;
import br.com.caelum.livraria.modelo.Livro;
import br.com.caelum.livraria.modelo.LivroDataModel;

@Named 
@ViewScoped 
public class LivroBean implements Serializable{

    private static final long serialVersionUID = 1L;

    private Livro livro = new Livro();
    private Integer autorId;
    private List<Livro> livros;
    private LivroDataModel livroDataModel = new LivroDataModel();
    private List<String> generos = Arrays.asList("Romance", "Drama", "Ação");

    @Inject
    private LivroDAO livroDao;

    @Inject
    private AutorDAO autorDao;

    public void gravar() {
        System.out.println("Gravando livro " + this.livro.getTitulo());

        if (this.livro.getAutores().isEmpty()) {
            FacesContext.getCurrentInstance().addMessage("autor", new FacesMessage("Livro deve ter pelo menos um Autor."));
            return;
        }else{

        if (this.livro.getId() == null) {            
            livroDao.adiciona(this.livro);    
            this.livros = livroDao.listaTodos();
        }else{            
            this.livroDao.atualiza(this.livro);
        }

        this.livro = new Livro();

        }
    }
Restante do código omitido

Parte da classe LivroDAO

package br.com.caelum.livraria.dao;

import java.io.Serializable;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.persistence.EntityManager;

import br.com.caelum.livraria.modelo.Livro;

@SuppressWarnings("serial")
public class LivroDAO implements Serializable {

    @Inject
    EntityManager manager;

    private DAO<Livro> livroDao;

    @PostConstruct
    void init() {
        this.livroDao = new DAO<Livro>(this.manager, Livro.class);
    }

    public void adiciona(Livro t) {
        livroDao.adiciona(t);
    }
Restante do código omitido

Parte da classe DAO

package br.com.caelum.livraria.dao;

import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

public class DAO<T> implements Serializable{

    private static final long serialVersionUID = 1L;

    private final Class<T> classe;
    private EntityManager em;

    public DAO( EntityManager em, Class<T> classe) {
        this.classe = classe;
        this.em = em;
    }

Restante do código omitido
5 respostas

Boa tarde tudo beleza? olhando o seu código acho que você esqueceu da anotação do CDI na sua variavel.

package br.com.caelum.livraria.dao;

import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

public class DAO<T> implements Serializable{

    private static final long serialVersionUID = 1L;

    private final Class<T> classe;
    private EntityManager em;

    public DAO( EntityManager em, Class<T> classe) {
        this.classe = classe;
        this.em = em;
    }
package br.com.caelum.livraria.dao;

import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

public class DAO<T> implements Serializable{

    private static final long serialVersionUID = 1L;

    private final Class<T> classe;
    @Inject // acho que falto a sua anotação
    private EntityManager em;

    public DAO( EntityManager em, Class<T> classe) {
        this.classe = classe;
        this.em = em;
    }

Lembra que quem instancia agora é o CDI automaticamente? E não a gente

Boa tarde, Alisson!!!

Olhei novamente o código da classe DAO do professor "Nico Steppat" e lá não tem injeção de CDI na variável em questão, mas mesmo assim segui sua sugestão e não fui feliz, pois o mesmo erro permanece.

public class DAO<T> implements Serializable{

    private static final long serialVersionUID = 1L;

    private final Class<T> classe;
    @Inject //Injeção de CDI conforme sugerido
    private EntityManager em;



    public DAO( EntityManager em, Class<T> classe) {
        this.classe = classe;
        this.em = em;
    }

Ah não então deixa igual a do Nico ele manda bem de mais, tenta aqui então amigo. No lugar do seu

 @Inject
    EntityManager manager;

    private DAO<Livro> livroDao;

    @PostConstruct
    void init() {
        this.livroDao = new DAO<Livro>(this.manager, Livro.class);
    }

    public void adiciona(Livro t) {
        livroDao.adiciona(t);
    }
 @Inject
    EntityManager manager;
     @Inject // acho que falto aqui a sua anotação
    private DAO<Livro> livroDao;

    @PostConstruct
    void init() {
        this.livroDao = new DAO<Livro>(this.manager, Livro.class);
    }

    public void adiciona(Livro t) {
        livroDao.adiciona(t);
    }

Boa tarde, Alisson!

Muito obrigado pelo apoio nessa corrida de aprendizado.

Depois que implementei as alterações abaixo a aplicação funcionou.

Estava faltando eu alterar a classe JPAUtil, acrescentando as anotações @Produces, @RequestScoped e @Disposes;

Também alterar a classe DAO removendo as informações em.close e EntityManager em = new JPAUtil().getEntityManager(); dos métodos nela contidos.

Classe JPAUtil após alteração

public class JPAUtil {

    private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("livraria");

    @Produces
    @RequestScoped
    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void close(@Disposes EntityManager em) {
        em.close();
    }
}
solução!

Ah sim eu até pensei em te falar isso, mais achei que você tivesse feito kkk. Boa mano que bom que você descobriu o erro. bons estudos e sucesso! abraços

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software