2017-09-16 5 views
0

J'essaie de créer un projet Web EJB avec Wildfly et une connexion à la base de données pour conserver ma classe "Article". Mais quand je commence ma demande que je reçois l'erreurEJB injecter des dépendances insatisfaites

Causée par: org.jboss.weld.exceptions.DeploymentException: WELD-001408: dépendances non satisfaites pour le type ArticleDAO avec des qualificatifs @default au point d'injection [BackedAnnotatedField]

@Inject privé serrvices.Customer.dao à serrvices.Customer.dao (Customer.java:0) Cette exception est causée par ma déclaration @Inject mais je ne peux pas savoir où est le problème. Je cherchai déjà le web et placé un beans.xml dans le dossier méta-inf avec:

haricot-découverte-mode = "all">

mais sans succès. Voici mes classes associées:

Customer.java

package serrvices; 

import javax.ejb.EJB; 
import javax.ejb.Stateless; 
import javax.inject.Inject; 
import javax.ws.rs.Consumes; 
import javax.ws.rs.GET; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 

import beans.CustomerManager; 


@Path("customer") 
public class Customer { 

    @EJB 
    private CustomerManager manager; 


    /* 
    @GET 
    @Produces(MediaType.TEXT_HTML) 
    public String getCustomerCount() { 
     return "<h3>Customer Count: " + manager.getCustomerCount() + "</h3>"; 
    } 
    */ 

    @Inject 
    private ArticleDAO dao; 




    @GET 
    //@Consumes({"application/xml", "application/json"}) 
    public void insert() 
    { 
     ArticleDTO userr = new ArticleDTO(999,"XXX",99); 
     System.out.println("insert: " + userr); 

     dao.createArticle(userr.getDescription(), userr.getPrice()); 
    } 

} 

ArticleDAO

serrvices de paquet;

import java.util.List; 


public interface ArticleDAO 
{ 
    Article insert(Article user); 
    Article update(Article user); 
    void delete(Article user); 

    Article findById(int id); 
    List<Article> findAll(); 

    Article createArticle(String description, long price); 
} 

ArticleDAOImpl

package serrvices; 

import java.util.List; 

import javax.ejb.LocalBean; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 



class ArticleDAOImpl 
    implements ArticleDAO 
{ 
    //private final Logger LOG = Logger.getLogger(ArticleDAOImpl.class); 

    @PersistenceContext 
    private EntityManager em; 


    /* 
    * CRUD Operations 
    */ 

    @Override 
    public Article insert(Article article) 
    { 
     System.out.println("insert(" + article + ")"); 
     em.persist(article); 
     return article; 
    } 

    @Override 
    public Article update(Article article) 
    { 
     System.out.println("update(" + article + ")"); 
     return em.merge(article); 
    } 

    @Override 
    public void delete(Article article) 
    { 
     System.out.println("delete(" + article + ")"); 
     em.remove(article); 
    } 

    @Override 
    public Article findById(int id) 
    { 
     System.out.println("findById(" + id + ")"); 
     return em.find(Article.class, id); 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    public List<Article> findAll() 
    { 
     System.out.println("findAll()"); 
     final String hql = "SELECT u FROM " + Article.class.getName() + " AS u";   
     return em.createQuery(hql).getResultList(); 
    } 


    /* 
    * Factory methods 
    */ 

    @Override 
    public Article createArticle(String description, long price) 
    { 
     System.out.println("createArticle(\"" + description + "\"," + price +")"); 

     Article u = new Article(); 
     u.setDescription(description); 
     u.setPrice(price); 
     insert(u); 
     return u; 
    } 
} 
+0

Je sais, le balayage ne doit pas faire nécessaire, mais avez-vous déjà essayé annoter les haricots de façon appropriée. ArticleDAOImpl vous pouvez annoter comme @ApplicationScoped. L'option suivante serait de regarder, ce qui se passe si vous injectez ArticleDAOImpl au lieu de l'interface. Je sais que cela ne devrait pas être nécessaire, mais peut-être que certains conseils pourraient vous amener plus loin à la cause des problèmes. – aschoerk

+0

placez le beans.xml dans WEB-INF au lieu de META-INF si vous êtes dans un projet de guerre. Vous n'avez pas besoin d'ajouter d'annotation @ApplicationScoped si le mode de découverte est tout. – Rouliboy

Répondre

1

Lorsque le conteneur CDI haricots et initialise les dépendances injecte, il ne peut injecter des objets dans d'autres objets que le conteneur est au courant, sinon il ne fera pas l'injection. La classe dans laquelle vous injectez doit être connue du conteneur.

Essayez annoter votre ArticleDAOImpl classe avec @Named et @ApplicationScoped