2017-09-16 4 views
0

Ich versuche, ein EJB-Web-Projekt mit Wildfly und eine Datenbankverbindung zu erstellen, um meine Klasse "Artikel" zu erhalten. Aber wenn ich meine Anwendung starten erhalte ich die FehlerEJB injizieren unbefriedigte Abhängigkeiten

Verursacht durch: org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unbefriedigend Abhängigkeiten für Typ ArticleDAO mit Qualifier @Default an der Injektionsstelle [BackedAnnotatedField] @Inject privaten serrvices.Customer.dao bei serrvices.Customer.dao (Customer.java:0)

Diese Ausnahme von meiner @Inject Aussage verursacht wird, aber ich kann nicht heraus, wo das Problem ist. Ich suchte schon die Bahn und legte eine beans.xml im Ordner META-INF mit:

bean-Discovery-mode = "all">

aber kein Erfolg. Hier sind meine verwandten Klassen:

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

Paket serrvices;

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

Ich weiß, mit Anmerkungen versehen, macht das Scannen soll dies nicht notwendig, aber haben Sie schon versuchen, die Bohnen in geeigneter Weise mit Anmerkungen zu versehen. ArticleDAOImpl könnten Sie als @ApplicationScoped kommentieren. Die nächste Option wäre, zu schauen, was passiert, wenn Sie ArticleDAOImpl anstelle der Schnittstelle injizieren. Ich weiß, dass dies nicht notwendig sein sollte, aber vielleicht könnten einige Hinweise Sie weiter zur Ursache der Probleme bringen. – aschoerk

+0

Lege die beans.xml in WEB-INF anstelle von META-INF, wenn du in einem Kriegsprojekt bist. Sie müssen keine @ApplicationScoped-Annotation hinzufügen, wenn der Erkennungsmodus aktiviert ist. – Rouliboy

Antwort

1

Wenn der CDI Container initialisiert Bohnen und spritzt Abhängigkeiten, es werden nur Objekte in andere Objekte injizieren kann, dass der Behälter bewusst ist, sonst wird es die Injektion nicht. Die Klasse, in die Sie injizieren, muss dem Container bekannt sein.

Versuchen Sie, Ihre ArticleDAOImpl CLASS mit @Named und @ApplicationScoped

Verwandte Themen