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

Erro WELD-001408 mesmo criando um Producer

Utilizando o projeto que foi disponibilizado pelo video do exercício e mesmo seguindo passo a passo, o Tomcat continua apresentando a mesma mensagem : WELD-001408: 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)

As classes: ProdutoDao

package br.com.caelum.vraptor.dao;

import java.util.List;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;

import br.com.caelum.vraptor.model.Produto;

@RequestScoped
public class ProdutoDao {

    private final EntityManager em;

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

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


    public void adiciona(Produto produto) {
        em.getTransaction().begin();
        em.persist(produto);
        em.getTransaction().commit();
    }

    public void remove(Produto produto) {
        em.getTransaction().begin();
        em.remove(busca(produto)); 
        em.getTransaction().commit();
    }

    public Produto busca(Produto produto) {
        return em.find(Produto.class, produto.getId());
    }

    @SuppressWarnings("unchecked")
    public List<Produto> lista() {
        return em.createQuery("select p from Produto p").getResultList();
    }
}

ProdutoController

package br.com.caelum.vraptor.controller;

import java.util.List;

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

import org.hibernate.annotations.Index;

import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.dao.ProdutoDao;
import br.com.caelum.vraptor.model.Produto;
import br.com.caelum.vraptor.util.JPAUtil;
import br.com.caelum.vraptor.view.Results;

@Controller
public class ProdutoController {

    private final Result result;
    private final ProdutoDao produtoDao;

    @Inject
    public ProdutoController(Result result, ProdutoDao produtoDao) {
        this.result = result;
        this.produtoDao = produtoDao;
    }

    @Deprecated
    public ProdutoController() {
        this(null,null); 
    }

    @Get("/")
    public void inicio(){

    }

    @Get
    public List<Produto> lista(){
        return produtoDao.lista();
    }

    @Get
    public void listaXML(){
        result.use(Results.xml()).from(produtoDao.lista()).serialize();
    }

    @Get
    public void sobre(){

    }

    @Get
    public void formulario(){

    }

    @Post
    public void adiciona(Produto produto){
        produtoDao.adiciona(produto);
        result.include("mensagem", "Produto adicionado com sucesso!");
        result.redirectTo(ProdutoController.class).lista();
    }

    @Get
    public void remove(Produto produto){
        produtoDao.remove(produto);
        result.redirectTo(ProdutoController.class).lista();
    }
}

EntityManagerProducer

package br.com.caelum.vraptor.util;

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

public class EntityManagerProducer {

    @Produces @RequestScoped
    public EntityManager criaEM(){
        return JPAUtil.criaEntityManager();
    }
}
5 respostas

Oi Martin,

algumas perguntas para achar o problema:

  1. Aparece mais alguma informação ou Stacktrace no console para ajudar?
    1. Vc consegue initializar o JPA sem CDI, por exemplo, dentro de um método main?
    2. O CDI chama o método criaEM() durante o request? (coloque um syso para verificar)

abs

Olá Nico,

Antes de implementar com CDI, o JPA estava conseguindo inicializar.

A mensagem aparece quanto eu inicio o tomcat e não conseguido efetuar um request, pois quando eu carrego a página da lista de produtos, aparece a mensagem 404.

Segue mais informações do console pra ajudar:

out 15, 2014 2:09:12 PM org.apache.catalina.core.StandardContext listenerStart
GRAVE: Exception sending context initialized event to listener instance of class org.jboss.weld.environment.servlet.Listener
org.jboss.weld.exceptions.DeploymentException: WELD-001408: 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)

    at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:361)
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:282)
    at org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:133)
    at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:164)
    at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:507)
    at org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:68)
    at org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:66)
    at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:60)
    at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:53)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

out 15, 2014 2:09:12 PM org.apache.catalina.core.StandardContext startInternal
GRAVE: Error listenerStart
out 15, 2014 2:09:12 PM org.apache.catalina.util.SessionIdGeneratorBase createSecureRandom
INFORMAÇÕES: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [254] milliseconds.
out 15, 2014 2:09:12 PM org.apache.catalina.core.StandardContext startInternal
GRAVE: Context [/vraptor-produtos] startup failed due to previous errors
out 15, 2014 2:09:12 PM org.apache.catalina.core.StandardContext listenerStop
GRAVE: Exception sending context destroyed event to listener instance of class org.jboss.weld.environment.servlet.Listener
java.lang.NullPointerException
    at org.jboss.weld.servlet.WeldInitialListener.contextDestroyed(WeldInitialListener.java:102)
    at org.jboss.weld.servlet.api.helpers.ForwardingServletListener.contextDestroyed(ForwardingServletListener.java:30)
    at org.jboss.weld.environment.servlet.Listener.contextDestroyed(Listener.java:85)
    at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4792)
    at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5392)
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:160)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Obrigado pelo retorno,

Abs

Fazendo alguns testes eu consegui essa mensagem de erro:

out 15, 2014 7:54:53 PM org.apache.catalina.core.StandardContext listenerStart
GRAVE: Exception sending context initialized event to listener instance of class org.jboss.weld.environment.servlet.Listener
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 [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)

    at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:361)
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:282)
    at org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:133)
    at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:164)
    at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:507)
    at org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:68)
    at org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:66)
    at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:60)
    at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:53)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Exception 0 :
org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type EntityManager with qualifiers @Default
  at injection point [BackedAnnotatedParameter] Parameter 1 of [BackedAnnotatedConstructor] @Inject public br.com.caelum.vraptor.dao.UsuarioDao(EntityManager)
  at br.com.caelum.vraptor.dao.UsuarioDao.<init>(UsuarioDao.java:0)

    at org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:361)
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:282)
    at org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:133)
    at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:164)
    at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:507)
    at org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:68)
    at org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:66)
    at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:60)
    at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:53)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

    at org.jboss.weld.bootstrap.ConcurrentValidator.validateBeans(ConcurrentValidator.java:76)
    at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:468)
    at org.jboss.weld.bootstrap.WeldStartup.validateBeans(WeldStartup.java:392)
    at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:85)
    at org.jboss.weld.environment.servlet.Listener.contextInitialized(Listener.java:170)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4751)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5175)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

out 15, 2014 7:54:53 PM org.apache.catalina.core.StandardContext startInternal
GRAVE: Error listenerStart
out 15, 2014 7:54:53 PM org.apache.catalina.util.SessionIdGeneratorBase createSecureRandom
INFORMAÇÕES: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [251] milliseconds.
out 15, 2014 7:54:53 PM org.apache.catalina.core.StandardContext startInternal
GRAVE: Context [/vraptor-produtos] startup failed due to previous errors
out 15, 2014 7:54:54 PM org.apache.catalina.core.StandardContext listenerStop
GRAVE: Exception sending context destroyed event to listener instance of class org.jboss.weld.environment.servlet.Listener
java.lang.NullPointerException
    at org.jboss.weld.servlet.WeldInitialListener.contextDestroyed(WeldInitialListener.java:102)
    at org.jboss.weld.servlet.api.helpers.ForwardingServletListener.contextDestroyed(ForwardingServletListener.java:30)
    at org.jboss.weld.environment.servlet.Listener.contextDestroyed(Listener.java:85)
    at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4792)
    at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5392)
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:160)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

out 15, 2014 7:54:54 PM org.apache.catalina.startup.HostConfig deployDirectory
solução!

Oi Martin, o problema é o package. Esse pacote br.com.caelum.vraptor.util era reservado do VRaptor, as classes dele não eram gerenciadas (isso foi um bug do weld, recentemente saiu um fix, vou atualizar a versão do curso). Mude de pacote que vai funcinar. Um abraço

Era isso mesmo Rodrigo. Para fazer tudo certinho, importei novamente o projeto que está disponível no curso e renomeei o pacote br.com.caelum.vraptor.util para br.com.teste.vraptor.util e funcionou.

Muito obrigado Rodrigo e Nico pela ajuda.

Um abraço